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

用 continuation 开发复杂的 Web 应用程序(6)理解应用程序逻辑

用 continuation 开发复杂的 Web 应用程序(6)理解应用程序逻辑

理解应用程序逻辑有了上面的解释,理解应用程序逻辑就应当很容易了。脚本首先要求把一个由         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。

JavaScript vs. Java 语言现在我来到了用 JavaScript 开发的基于 continuation 的示例应用程序的末尾。还可以用另一个在纯 Java 语言上工作的 Cocoon 流解释器开发相同的应用程序,这样您就可以把整个应用程序逻辑编写成一个单独的 Java 程序。我将立即向您演示 Java 解释器的工作方式,但是首先我想讨论一下支持和反对用 Java 语言编写程序的争论。
关于用 JavaScript 代替 Java 语言最常见的争论是 Java 语言是更有名、使用更广的语言,有丰富的 IDE 支持,有丰富的设计模式等等。而支持 JavaScript 的一方认为,它是动态类型化的,使得进行快速原型设计(编写 / 更新 - 部署 - 测试周期更快)成为可能。作为语言,众所周知有大量的 Java 开发人员在客户机浏览器端使用它,而且非常容易掌握。JavaScript 是面向对象语言,而 Rhino 的实现则与 Java 平台有非常好的集成。可能访问、重用应用程序中已经存在的 Java 类或对象。所以,即使核心流是用 JavaScript 实现的,也有可能用 Java 语言实现实际的业务逻辑(因为可以在适当的位置在 JavaScript 流内访问 Java 类)。
简而言之,在两个选项中,没有任何一项比另外一项有非常明显的优势,具体采用哪种语言进行开发则基于 continuation 的应用程序,完全取决于您的个人偏好。而幸运的是,Cocoon 让您可以选择其中任何一个选项。
返回列表