IBM Books

管理与程序设计指南,OS/400 版


持久性宏的例子

以下这个简单的宏包含了多个在一个单独事务中运行的 HTML 块:

@dtw_static()
%define a = "0"
%define(transient) b = "0"
%define handle = ""
@dtw_rtvhandle(handle)
 
%html(report) {
@dtw_accept(handle)
a = $(a)<br>
b = $(b)<br>
@dtw_add(a, "2", a)
@dtw_add(b, "2", b)
<a href="/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/report2">
click here to continue</a><br>
<a href="/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/quit">
click here to quit</a><br>
%}
 
%html(report2) {
@dtw_accept(handle)
a = $(a)<br>
b = $(b)<br>
@dtw_add(a, "2", a)
@dtw_add(b, "2", b)
<a href="/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/report3">
Click here to continue</a><br>
<a href="/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/quit">
Click here to quit</a><br>
%}
 
%html(report3) {
@dtw_accept(handle)
a = $(a)<br>
b = $(b)<br>
@dtw_add(a, "2", a)
@dtw_add(b, "2", b)
<a href="/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/quit">
Click here to quit</a><br>
%}
 
%html(quit) {
@dtw_terminate()
a = $(a)<br>
b = $(b)<br>
done
%}

假定第一个调用是调用 HTML 块 report,则 Net.Data:

  1. 调用 DTW_STATIC() 函数,它表示此宏是持久性的。

  2. 创建变量 a,作为 STATIC 变量,因为持久性宏的缺省值就是 STATIC。

  3. 创建变量 b,作为 TRANSIENT 变量,因为它是用 TRANSIENT 属性明确定义的。

  4. 调用 DTW_RTVHANDLE(),它生成一个事务句柄并将该句柄放入变量 handle

  5. 开始处理 HTML 块 report 并调用 DTW_ACCEPT(),它告诉 Net.Data 这个事务的 事务句柄是什么。

  6. 找到要发送给浏览器的输出,这将使 Net.Data 向 Web 服务器发送 HTTP 首部,表示事务将要开始。

  7. 显示 HTML 页面。变量 ab 的值都为 0。

在将第一个页面输出发送给浏览器之后,用户可以选择继续该事务或者退出。如果选择继续, 则 Web 服务器将调用 URL:

/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/report2

Web 服务器将事务句柄识别为 Net.Data 在 HTTP 首部所指定的句柄。它将 Net.Data 作为 持久性 CGI 程序调用,这意味着宏调用是当前事务的一部分。

调用 HTML 块 report2 时,Net.Data:

  1. 调用 DTW_STATIC() 函数,它表示此宏是持久性的。

  2. 识别出变量 a 是一个 STATIC 变量,保留当前值而不是重新初始化为 0。

  3. 识别出变量 b 是一个 TRANSIENT 变量,创建该变量的一个新实例并初始化为 0。

  4. 调用 DTW_RTVHANDLE(),它生成一个事务句柄并将该句柄放入变量 handle。

  5. 开始处理 HTML 块 report2 并调用 DTW_ACCEPT(),它告诉 Net.Data 这个事务的 事务句柄是什么。

  6. 找到要发送给浏览器的输出,这将使 Net.Data 向服务器发送 HTTP 首部,表示事务将要继续。

  7. 显示 HTML 页面。变量 a 的值将为 2,而变量 b 的值将为 0。 a 的值在前一次调用后被保留,因为它是一个静态变量。 变量 b 的值被复位为 0。

在将第二个页面发送给浏览器之后,用户可以选择继续该事务或者退出。如果选择退出, 则 Web 服务器将调用以下 URL:

/cgi-bin/db2www/$(handle)/qsys.lib/mylib.lib/macros.file/pcgi1.mbr/quit

Web 服务器将事务句柄识别为 Net.Data 在 HTTP 首部所指定的句柄,并将 Net.Data 作为 持久性 CGI 程序调用,这意味着宏调用是当前事务的一部分。

调用 HTML 块退出时,Net.Data:

  1. 调用 DTW_STATIC() 函数,它表示此宏是持久性的。

  2. 识别出变量 a 是一个 STATIC 变量,保留当前值而不是重新初始化为 0。

  3. 识别出变量 b 是一个 TRANSIENT 变量,创建该变量的一个新实例并初始化为 0。

  4. 调用 DTW_RTVHANDLE(),它生成一个事务句柄并将该句柄放入变量 handle。

  5. 开始处理 HTML 块 quit 并调用 DTW_TERMINATE(),它告诉 Net.Data 这是该事务中最后一个调用。

  6. 找到要发送给浏览器的输出,这将使 Net.Data 向服务器发送 HTTP 首部,表示事务将要结束。

  7. 显示 HTML 页面。变量 a 的值为 4,变量 b 的值为 0。

  8. 清除所有变量和具有事务级作用域的其它资源(因为执行了 DTW_TERMINATE() 调用)。


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]