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

- UID
- 1072456
|

用 continuation 开发复杂的 Web 应用程序(6)
应用程序站点地图示例购物应用程序的站点地图如清单 3 所示:
清单 3. 示例应用程序的 Cocoon 站点地图1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?xml version="1.0"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
<map:flow language="javascript">
<map:script src="pos.js"/>
</map:flow>
<map:pipelines>
<map:pipeline>
<map:match pattern="page/*">
<map:generate type="jx" src="screens/{1}.xml"/>
<map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl">
<map:parameter name="servletPath" value="{request:servletPath}"/>
<map:parameter name="sitemapURI" value="{request:sitemapURI}"/>
<map:parameter name="contextPath" value="{request:contextPath}"/>
<map:parameter name="file" value="/samples/flow/jxrate/screens/{1}.xml"/>
</map:transform>
<map:serialize/>
</map:match>
</map:pipeline>
<map:pipeline>
<map:match pattern="continue.*">
<map:call continuation="{1}"/>
</map:match>
<map:match pattern="">
<map:call function="sellItem"/>
</map:match>
</map:pipeline>
</map:pipelines>
</map:sitemap>
|
XML 文件中的第一个块(
flow)向 Cocoon 声明:Flowscript 解释器必须用 JavaScript 作为目标语言,实现应用程序的流逻辑(flow logic)的源代码在文件 pos.js 中。
下一个代码块则实际声明了应用程序要使用的管道。它定义了以下三个管道:
- 任何对资源的请求,如果资源的 URI 与正则表达式
page/*匹配,就会激活站点地图中声明的第一个管道。要在这个管道中使用的生成器叫做
jx,它基本上是一个标准的生成器组件,由叫做XTemplateGenerator的 Cocoon 组件提供。
JXTemplateGenerator是一个页面模板处理器,它允许您把 Cocoon Flowscript(在示例应用程序中是 pos.js 文件)传递过来的来自 JavaScript 中的数据插入管道。正则表达式中的
*部分根据输入的请求提取特定的值,然后生成器可以通过
{1}使用这个值。这样,对 URI
page/A的请求会使
JXTemplateGenerator把 screens/A.xml 作为源代码。 - 任何对资源的请求,如果资源的 URI 与正则表达式
continue.*匹配,就会激活第二个管道。您可以看到,示例应用程序把 continuation
id作为表单要提交的 URL 的一部分,从而把 continuation
id传递给浏览器。像以前一样,实际的 continuation
id作为
{1}使用。
call元素实际上要求继续执行由{1}当前持有的值标识的 continuation。
call元素还有第二个变体,您接下来会看到。 - 与在站点地图中声明的最后一个管道匹配的请求,实际上是与前两个正则表达式不匹配的任何请求(例如,对应用程序发出的第一个请求发向 URI“
/”,然后激活这个管道)。在这里,
call元素要求站点地图调用 Flowscript(pos.js)中定义的顶级函数
sellItem。实际的效果是:对应用程序(URI "
/")的第一个请求会开始 pos.js 的执行。 请注意,所有组件一般都要在站点地图中声明。我不需要声明清单 3 中的应用程序组件,因为我把示例应用程序作为 Cocoon 示例的一部分运行,其中有一个顶级站点地图,已经替我声明了这些组件(例如jx)。 |
|
|
|
|
|