首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 continuation 开发复杂的 Web 应用程序(8)

用 continuation 开发复杂的 Web 应用程序(8)

理解应用程序逻辑有了上面的解释,理解应用程序逻辑就应当很容易了。脚本首先要求把一个由
page/getRateAmt标识的页面发送到用户。这与站点地图中的第一个管道匹配,并会使
JXTemplateGenerator组件拾取文件 screens/getRateAmt.xml,把它传递给管道中的下一个组件。清单 5 显示了这个组件的 XML 文件 getRateAmt.xml:

清单 5. getRateAmt 的 XML 文件
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>
<page>
   <title>Get Rate and Quantity of item to be purchased</title>
   <content>
     <form method="post" action="continue.#{$cocoon/continuation/id}">
       <para>Enter Rate: <input type="text" name="rate"/></para>
       <para>Enter Quantity: <input type="text" name="qty"/></para>
       <input type="submit" name="submit" value="Next"/>
     </form>
   </content>
</page>




这个文件中要注意的要点是表单上的
action字段使用 JXPath 表达式
#{$cocoon/continuation/id}。当在控制脚本中执行对应于其页面的
sendPageAndWait调用时,这个表达式会被 Cocoon 生成的 continuation
id自动替换。这样会使表单提交给与正则表达式
continue.*匹配的 URL,然后会使站点地图中对应(实际上是在站点地图中声明的第二个)管道被激活。(正如前面所看到的,这个管道只包含一条
call语句,它将继续执行指定的
id标识的 continuation。)


继续执行 continuation继续执行 continuation 实际上把控制返回了脚本中紧跟在
sendPageAndWait调用之后的脚本行。接下来的两行代码将从请求中提取
rate和
qty参数。当对
page/getZone页面(映射到物理文件 screens/getZone.xml)进行
sendPageAndWait调用时,会生成下一个 continuation。这个调用也接受由名称 / 值组合对构成的
map参数,这是用户在前一个页面中提交的两个基本参数。

为了更好地理解这些名称 / 值组合对的工作方式,我们来看
/getZone页面背后的 XML 文件,如清单 6 所示:

清单 6. getZone 页面背后的 XML 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<page>
   <title>Get Buyer Category and Delivery Option</title>
   <content>
     <form method="post" action="continue.#{$cocoon/continuation/id}">
       <para>You are buying #{qty} items, at #{rate} apiece</para>
       <para>Please specify your category:<br/>
        <input type="radio" name="zone" value="A">A</input><br/>
        <input type="radio" name="zone" value="B">B</input><br/>
        <input type="radio" name="zone" value="C">C</input><br/>
        </para>
        <para>Will you be picking up the item yourself from our warehouse,
         or would you like it shipped?<br/>
            <input type="radio" name="delOpt" value="P">Pickup</input><br/>
            <input type="radio" name="delOpt" value="S">Shipping</input><br/>
        </para>
       <input type="submit" name="submit" value="Next"/>
     </form>
   </content>
</page>




这个页面被装配好,把用户在前一页中输入的 rate 和 quantity 值显示给用户。您会注意到,这个 XML 文件中的占位符是
#{qty}和
#{rate}—— 当合成 HTML 页面的时候,会在 map 中查找这些名称,并用 map 中对应的值代替。像前面一样,这个表单的
action字段指向指定页面的 continuation
id,它代表为getRateAmt页面生成的 continuation 的子 continuation。

应用流的剩余部分,也可以用类似的风格理解。需要注意的一件有趣的事是,只有在用户选择 “S”为采购的产品选择送货上门时,
getShipOpt才显示给用户。如果用户选择了这个选项,就会生成一个新的 continuation。如果用户选择了 "P" 自取,那么不必显示
getShipOpt页面,因此也就不会生成 continuation。
返回列表