商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

Perl在WAP网站中应用实例一谈

  【IT168 技术文档】WAP是无线应用程序通讯协议(Wireless Application Protocal的简称。WAP 定义了一套由 XML标准延伸而来的标记语言,称为「无线标记语言Wireless Markup Language, WML」),专门用来将准备传送给无线上网设备的内容进行编码。与HTML用来定义资料在一般网络浏览器上面的显示与动作方式的标记语言那样,WML是用来定义资料如何在无线上网设备上显示与动作的标记语言。WAP与WML技术对于提供信息给客户与在办公室外工作的员工来说,都是相当适合的技术。在这里我将会通过几个简单的例子向大家介绍在Perl程序语言在WAP网站的的应用,使你对Perl语言有一个更深入的认识。

  注:本文部份资料译自Comprehensive Perl Archive Network网站(网址:http://cpan.org/)本文适用于对XML和HTTP有一定认识的读者。

  1、编写动态CGI程序

  由于 WAP 同样使用HTTP通讯协议,因此你可以依照为一般网络浏览器开发动态内容程序相同的设计策略来为无线上网工具开发应用程序。事实上,你甚至可以说两者的开发流程除了一些特定的细节部分以外,大致上都是相同的。首先,一般的网络浏览器接受的内容类型(HTTP 通讯中的 Content-Type 表头)信息为 text/html,而无线上网的客户端程序则要求你的程序送出 text/vnd.wap.wml 做为内容类型的值。其次,由于传送给无线上网客户端程序的文件事实上是一个XML文件,因此你必须将 XML 文件类型宣告字符串一并送出。只要你注意以上两点,那么你便可以开始传送你的内容了。下面是一个很简单的传送 WML 文件的 CGI 程序。

  #!/usr/bin/perl   print "Content-type: text/vnd.wap.wml\n\n";   print "\n";   print " \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";   print "\n";   print " \n";   print " 欢迎来到我的WAP网站!\n";   print " \n";   print "\n";

  这个例子演示了如何在WML文件里面传送正确的HTTP与XML表头信息给浏览器。由于我们传送的实际上是一个XML文件,因此在输出资料的时候请记得要遵循正确的语法与格式。一般的网络浏览器对于内容类型或者表头宣告等信息的语法和格式都非常宽容,然而WAP客户端程序却非如此。

  上面这个程序所输出的内容虽然是实时产生的,但是它在任何状况下送出的内容都是完全相同的,互动性不是很好。为了解决这个问题,你可以通过CGI函式库来读取客户端送入的资料,并且根据这些传入的资料来实时建立新的内容传送回客户端。WML 本身被设计成尽可能内容能实时产生越好,这样的设计让页面中的每一个 deck 元素可以不需要送出新的 HTTP 请求给服务器便可以从一个card元素移动到另一个card 元素。不过这也意味着你在接收从 WML 文件传入的资料的时候要格外小心,必须确认最后一个card元素确实有传送所有的变量到服务器端才行。在下面的范例程序会从客户端读取来自不同card元素所送出的参数,并且将这些参数传送给服务器,然后据此建立一个新的deck元素。

#!/usr/bin/perl use CGI; print "Content-type: text/vnd.wap.wml\n\n"; print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"; print "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n"; my $input = new CGI; if ($input->param("completed")) { print "<wml>\n"; print " <card id='card1'>\n"; print " <p>Welcome to my dynamic wireless cgi\n</p>\n"; print " <p>Your name is: "; print " ".$input->param("first_name")." "; print " ".$input->param("middle_name")." "; print " ".$input->param("last_name")." "; print " </p>\n"; print " </card>\n"; print "</wml>\n"; } else { print "<wml>\n"; print " <card id=\"read_first_name\">\n"; print " <do type=\"accept\" label=\"Next\">\n"; print " <go href=\"#read_middle_name\"/>\n"; print " </do>\n"; print " <p>Please enter your first name</p>\n"; print " <p><input name=\"first_name\" emptyok=\"false\"/></p>\n"; print " </card>\n"; print " <card id=\"read_middle_name\">\n"; print " <do type=\"accept\" label=\"Next\">\n"; print " <go href=\"#read_last_name\"/>\n"; print " </do>\n"; print " <p>Please enter your middle name</p>\n"; print " <p><input name=\"middle_name\" emptyok=\"false\"/></p>\n"; print " </card>\n"; print " <card id=\"read_last_name\">\n"; print " <do type=\"accept\" label=\"Next\">\n"; print " <go href=\"#finish\"/>\n"; print " </do>\n"; print " <p>Please enter your last name</p>\n"; print " <p><input name=\"last_name\" emptyok=\"false\"/></p>\n"; print " </card>\n"; print " <card id=\"finish\">\n"; print " <do type=\"accept\" label=\"Continue\">\n"; print " <go method=\"get\" href=\"?\">\n"; print " <postfield name=\"first_name\" value=\"\$first_name\"/>\n"; print " <postfield name=\"middle_name\" value=\"\$middle_name\"/>\n"; print " <postfield name=\"last_name\" value=\"\$last_name\"/>\n"; print " <postfield name=\"completed\" value=\"true\"/>\n"; print " </go>\n"; print " </do>\n"; print " <p>Deck Summary:</p>\n"; print " <p>First name: \$first_name</p>\n"; print " <p>Mid name: \$middle_name</p>\n"; print " <p>Last name: \$last_name</p>\n"; print " <p>Press Continue to send to server</p>\n"; print " </card>\n"; print "</wml>\n"; }

  这个程序会读取来自每个 card 元素所送出的参数,并且将他们以HTTP get请求的型式传送给服务器。请注意在最后一个名为finish的card元素里面,我们在每一个 WML 变量(例如 $first_name)的前面全都加上一个斜线,这样才可以避免 Perl 将它们误认为 Perl 程序本身的变量来看待。一旦这些变量成功传送给服务器,我们的CGI程序便可以像其它任何一般的CGI变量那样读取它们。

1 2 3
©版权所有。未经许可,不得转载。
[责任编辑:cynthia]