用 continuation 开发复杂的 Web 应用程序(5)应用程序逻辑
- UID
- 1066743
|
用 continuation 开发复杂的 Web 应用程序(5)应用程序逻辑
应用程序逻辑我们的下一步是把应用程序逻辑写入脚本控制文件,在这个例子中,这个文件是 pos.js 文件。我前面提到过,这个文件包含一个叫做 sellItem的函数,它启动应用流(application flow),如清单 4 所示:
清单 4. 用 JavaScript 实现的应用流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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| function sellItem()
{
var rate, qty, zone, amount, discount, total, discrate,
savings, delOpt, delCost, Webcon;
var url = "page/getRateAmt";
cocoon.sendPageAndWait(url);
rate = parseFloat(cocoon.request.getParameter("rate"));
qty = parseInt(cocoon.request.getParameter("qty"));
amount = rate*qty;
url="page/getZone";
Webcon = cocoon.sendPageAndWait(url, {"rate":rate, "qty":qty});
zone = cocoon.request.getParameter("zone");
discount=0.02;
if (zone=="A")
{
if (qty >= 100)
{
discount=0.1;
}
}
else if (zone=="B")
{
if (qty >= 200)
{
discount=0.2;
}
}
discrate = 100*discount;
savings = discount*amount;
delCost=0.0;
delOpt = cocoon.request.getParameter("delOpt");
if (delOpt=="S")
{
url="page/getShipOpt";
cocoon.sendPageAndWait(url);
delCost = parseInt(cocoon.request.getParameter("delCost"));
}
total = amount + delCost - savings;
url="page/displayResult";
cocoon.sendPageAndWait(url,
{"discrate":discrate, "total":total, "savings":savings,
"delCost":delCost, "amount":amount, "discount":discount, "zone":zone});
}
|
cocoon 对象及其函数在这个示例中,您会注意到,我使用了一个叫做 cocoon的对象,但是没有在任何地方事先声明它。不需要声明 cocoon是因为它是 Cocoon 提供的供 Flowscripts 使用的一组默认系统对象的一部分。这组对象叫 Flow Object Model-FOM。
cocoon对象可能是 FOM 集中最重要、最常使用的对象,也是 FOM 的入口点。它是代表当前站点地图的全局变量。它提供了两个重要的函数: sendPage和 sendPageAndWait。两个函数都把控制传递给 Cocoon 站点地图,以便生成输出页面。
前一个函数有两个参数,一个是要发送回客户机的页面的站点地图 URI,另一个是 context对象,其中包含的数据可以提取出来,并替代生成的页面中的占位符。
我在清单 4 的应用程序逻辑中使用的后一个函数接受的两个参数与前一个函数的一样,但是有一点区别。在页面生成并发回客户机之后, sendPageAndWait函数生成并返回一个新的 continuation对象(也是 FOM 的一部分)。这时,Cocoon 内部也会生成一个惟一的 continuation id,并把两者之间的映射保存在一个全局结构中。
也可以向 sendPageAndWait函数传递一个函数,在完成对管道的处理但还没有创建 continuation 之前,传递的函数会自动执行。这是一个重要的特性,它适用的场合是:管道处理要求昂贵的或者争用程度高的资源,资源不适合与执行上下文的剩余部分绑定(因为用户可能在思考一段时间之后要求这个 continuation 继续执行,而在思考的整个时间中持有这些资源没有太大意义)。但是,我们的代码中没有使用函数的这个版本。 |
|
|
|
|
|