 |
|
|
显示部分
代码的显示部分是一行字符说"请输入:", 接着是两行, 可以用来输入荷兰盾或者是欧元. 两个输入域都带有格式符*N(意思是不限量的数字字符).
行为部分
行为部分和"prev"按纽联系在一起而且有一个标签叫做"Convert(转换)." 在do置标里, go置标会去执行一个外部的叫做wap.exe(PathInfo的值是/convert)
的URL (或者说WAP 应用), 这个URL 放在cgi-bin目录里. 我们将很快用Delphi 6 来创建这个WAP Web 服务应用.
使用POST 协议, 两个数据域和值会被传递给这个WAP 应用: 一个域叫做Guilder, 它有一个属于显示部分 Guilder 域的值,
另一个域叫做Euro, 它和显示部分的Euros 域是相关联的.
配置Web 服务器
要配置你的Web 服务器以便它能够明白WML 输出(和WBMP位图), 你需要添加两种特别的MIME 类型. 要做到这一点, 打开你的Web
服务器(比如Win2K上的IIS5)的配置对话框, 选择HTTP Headers 标签, 然后点击文件类型按纽, 为.wml(deck)页面注册text/vnd.wap.wml
并为.wbmp 图象注册image/vnd.wap.wbmp(如图B).
图B
注册必需的文件类型
可选的, 你也可以注册text/vnd.wap.wmlscript (为WMLScript) , 但我现在没有使用WMLScript.
生成WML
既然我们已经搭好了平台, 现在就应该启动Delphi 6(或者 Kylix) 然后建立一个能够生成WML的 Web 服务器应用程序了. Web
服务应用的类型并不重要, 但是既然在Delphi 和 Kylix 中相同的只有一种类型, 我就在我的例子中创建了一个CGI 可执行文件, 并命名为wap42.
记住任何Web 服务器程序都能够生成WML 代码, 所以在实际工程中, 你可以任意的试验ISAPI/NSAPI 或者 Apache DSO. 在Web
模块里右键单击并创建两个Web 行为单元: 一个带有/convert PathInfo 值而另一个没有PathInfo 值, 这个将成为缺省的Web 行为单元.
Web 行为单元编辑看起来如图C 一样.
图C
Web 行为单元
我们将从缺省的Web 行为开始. 选择这个单元, 然后在Object Inspector 窗口里找到OnAction 事件处理函数, 最后写下面的代码.
procedureTWebModule1.WebModule1WebActionItem0Action(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
begin
Response.ContentType := 'text/vnd.wap.wml';
Response.Content :=
'<?xml
version="1.0"?> ' + #10#13 +
'<!DOCTYPE
wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"' +
' "http://www.wapforum.org/DTD/wml_1.1.xml">'
+ #10#13 +
#10#13 +
'<wml>' +
'<card
id="euro" title="Euro Conversion">' +
'<p>' +
'Please
enter: <br/>' +
'Guilders: <input name="Guilders" format="*N"/><br/>' +
'Euro: <input name="Euros" format="*N"/>' +
'</p>' +
'<do type="prev"
label="Convert">' +
' <go method="post" href="/cgi-bin/wap.exe/convert">' +
' <postfield name="Guilder" value="$(Guilders)"/>' +
' <postfield name="Euro" value="$(Euros)"/>' +
' </go>' +
'</do>' +
'</card>' +
'</wml>';
end;
第一个语句与ContentType 有关, 缺省的值是text/html, 所以我们必须显式的将它改成text/vnd.wap.wml. 在我们设置了ContentType以后,
我们必须设置Response.Content 本身. 这是以两行的XML 头信息开始的, 然后紧跟我们在荷兰盾-欧元转化例子中看到的WML card.
唯一的不同是这一次, 我们将动态的生成WML (而不是使用一个静态的WML card). |