PERL编程24学时教程——19 复杂窗体.pdf
-
资源ID:70019611
资源大小:381.04KB
全文页数:9页
- 资源格式: PDF
下载积分:15金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
PERL编程24学时教程——19 复杂窗体.pdf
下载第1 9学时复 杂 窗 体We b上的窗体不只是简单的单页面窗体。有时窗体要跨越若干页。这些复杂的窗体以调查、查询和购物车等应用程序的形式出现。这些比较复杂的窗体需要使用某些不同的编程技巧,本学时你将要学习这些技巧。在本学时中,你将要学习:如何创建多页窗体。19.1 复杂的多页窗体使用C G I程序来编写复杂的多页窗体时,你会遇到一个特殊的编程难题。We b浏览器与We b服务器之间的连接根本不是一个持久的连接。We b浏览器与服务器建立连接,检查 We b页,然后便断开与We b服务器之间的连接。在服务器与你的We b浏览器之间并不保持不间断的连接。更为复杂的是:浏览器每次与 We b服务器连接时,We b服务器并不认为该浏览器预先访问过该站点。服务器并不每次都能很容易地识别该浏览器。类似的一种情况是:图书馆的读者与没有记忆力的图书馆管理员之间进行谈话,读者每次只能向管理员提出一个问题。读者向图书管理员借阅一本书,比如关于亚利桑那州的一本书,图书管理员可以检索这本书。图书管理员之所以能够检索这本书,是因为这个请求很容易满足。但是读者不能要求借阅同一个专题的另一本书。图书管理员不能记住上一个借书请求,因此他无法借给你同一个专题的另一本书。如果借书的请求改为“给我另一本关于亚利桑那州的书”,图书管理员仍然无法满足读者的要求,因为他检索的书可能与第一次检索的这本书一样。若要检索同一专题的第二本书,惟一的办法是说:“我需要另一本关于亚利桑那州的书,我已经有了一本名叫在亚利桑那州定居的书”。这个借阅请求带有足够的能够说明问题的信息,使图书管理员能够知道什么应答是不适当的。为We b页编写多页窗体,也可以使用同样的解决办法。每个问题/答复会话必须包含足够的信息,使We b服务器能够知道它需要做什么。你可以用几种不同的方法来创建这样的会话,其中的一种方法,即使用隐藏的H T M L域,将在本学时中介绍。19.2 隐藏域要使We b窗体能够“记住”信息,最容易的方法是使用隐藏域,将以前的信息嵌入 We b窗体。隐藏域是H T M L窗体的组成部分,它使域和值成为H T M L的组成部分,但是在显示窗体时,窗体中并不出现这些域和值。在H T M L中,这些域和值编写为下面的形式:如果将上面的H T M L代码放入一个窗体,新的名字(“f u l l n a m e”)和值(“Pink Floyd”)将成为窗体的组成部分。如果该窗体被提交给一个 Perl CGI程序,p a r a m函数将返回一个关键字和隐藏域的值。在线商店如果要举一个如何使用隐藏域的例子,可以看一看在线商店,它使用一系列的We b页,使人们能够根据在线目录来选购商品。目前,我们只是向你介绍复杂窗体的运行情况,在本学时后面部分的内容中,要介绍另一个复杂的窗体,它包含用于创建一个在线调查的代码。如果不能实现某种形式的安全 We b事务处理,那么请不要使用这个在线商店的例子,请注意,这个例子并不包含任何真实的个人信息,如电话号码或信用卡号码等,因为隐藏域就像正规的 H T M L窗体,它根本不具备任何安全性。图1 9-1所示的在线商店第一页显示了该商店的商品清单。当用户单击Go to Store(去商店)按钮时,C G I程序接收来自窗体的值,然后显示完整的目录,如图1 9-2所示。第二页显示完整的目录。当第一页(带有商店拥有商品的目录)提交时,C G I程序接收各个值,然后当它为完整的目录输出 H T M L时,它将商品的指定数量作为隐藏域放入新窗体。每当C G I程序接收来自H T M L窗体的值时,新页将包含隐藏域中的旧值,以及普通窗体元素中的新值。采用这个方法,你可以避免“健忘的图书管理员”存在的问题,当提交完整目录的窗体时,窗体中的隐藏域便提醒C G I程序从第一个窗体中选定哪些项目以及从当前窗体中选择哪些项目。如果需要第三页,前两页中的值可以作为隐藏域存放在第三页上,如图 1 9-3所示。关于H T M L页上的隐藏域,有几个问题应该加以说明。首先,隐藏域中的值是任何人都能够查看的。若要查看这些值,用户只需要查看该页的 H T M L源代码。大多数We b浏览器都配有一个选项,可以用于查看H T M L源代码。其次,隐藏域中的值可以由远程用户进行修改,如果他们确实想要这样做的话。若要修图19-1 在线商店的第一页图19-2 显示在线商店的商品目录218使用第三部分将Perl 用于C G I下载改隐藏域的值,可以使用修改后的 We b浏览器,或者使用H T T P人工提交该窗体。例如,在线商店不应该将价格存放在隐藏域中,它只能存放数量。C G I程序应该在需要显示价格时才查看价格。当你设计窗体时,看一看别人是如何设计窗体的,这将会对你有所帮助。这样你也会对他们是否使用隐藏域来保存信息这个问题有所了解。大多数We b浏览器都有一个View Page Source(查看页源)选项。你应该将这个选项用在任意窗体上,以了解它是如何形成一个整体的。但是不要拷贝这个窗体,大多数时候,拷贝会侵犯窗体的原开发人员的版权。19.3 多页调查窗体调查窗体是查找跨越若干不同的 We b页窗体的常见地方。有时这些窗体太长,一个 We b页放不下,它们通常可以分成不同的类别。接着,简单的多页We b调查窗体可以用于查找关于你的个人信息的各个方面。这个调查窗体可以展示4个不同的We b页,并且可以改为支持你需要的任何数目的We b页。这4个We b页是:第一页用于提出一系列的一般问题,有时它们可以用来查找你拥有哪些种类的个人信息。第二页用于提出一些关于你的习惯爱好的特殊问题,还有一个根据第一个调查页提出的问题。第三页是供你输入你的名字和对调查的说明的 We b页。在调查完成后输出的一条感谢你的消息。相同的C G I程序可以用来执行所有这 4个功能。它决定了哪一页用来打开下一页。这是根据刚才显示的这一页来决定的。程序清单 1 9-1显示了调查程序的核心。通过包含代码use CGI:Carp qw(fatalsToBrowser),你的C G I程序的d i e()消息(它通常被写入We b服务器的日志文件)将作为 We b页的组成部分来输出。当你编写更长的C G I程序时,它将有助于程序的调试。第19学时 复 杂 窗 体使用219下载图19-3 在线商店的发货信息调查的结果保存在一个文本文件中,但是该程序根本不显示该结果。该程序只不过进行调查结果的收集和存储。你必须编写另一个 C G I程序,以便显示调查的结果。程序清单19-1 调查程序的第一部分第6 8行:在调查过程中,每个 H T M L窗体都包含输入域。每个输入域的名字都出现在这个数组中。s a v e()函数和r e p e a t _ h i d d e n()函数将在以后使用这个数组。第1 2 1 3行:如果不将任何参数传递给该 C G I程序,也就是说,它没有作为窗体发送的结果来加载,那么就调用p a g e _ o n e()函数来输出调查窗体的第一页。第1 4 1 7行:如果名叫p a g e o n e的H T M L窗体参数被传递给这个C G I程序,便调用p a g e _ t w o()函数。如果传递的参数是p a g e t w o,便调用函数p a g e _ t h r e e。第1 9行:如果 H T M L窗体参数传递给这个 C G I程序,但是传递的参数不是 p a g e o n e或者p a g e t w o,则调查完成,其结果被保存,并在 s u r v e y _ d o n e()函数中输出感谢你的消息。每个We b页上的s u b m i t按钮都提供了一个关于下面应该加载哪一页的线索,你可以在图1 9-4中看到这个情况。由于 s u b m i t按钮的名字作为一个参数被传递给 C G I程序,因此它可以用来显示刚刚提交给程序的是We b页的哪个版本。程序清单1 9-2是调查程序的第二部分。程序清单19-2 调查程序的第二部分220使用第三部分将Perl 用于C G I下载第2 2 2 4行是个 P e r l新结构,你以前没有看到过,它称为“here document”。h e r ed o c u m e n t使你可以设定一个跨越若干行的字符串,它包含其他的引号,可以像一个普通的双引号那样来运行。若要开始编写一个 here document,你可以使用,后随一个单词。这个引号的内容就继续下去,直到在一行的开头再次出现该单词为止,如下例所示:用于标识here document开始的单词,即上面这个代码段中的 E N D _ O F _ Q U O T E,或者程序清单1 9-2中的E N D _ PA G E _ O N E,后面必须跟一个分号。在here document的结尾,该单词必须出现在第一列的开头,并且后面不能有任何字符,如空格或分号。在 here document内,变量像它们在普通双引号字符串(“”)中那样展开,因此在here document中,必须慎重使用$和字符。使用here document时,可以将大量的H T M L代码嵌入你的P e r l程序,而不会夹杂许多引号和多个p r i n t语句,从而造成混乱。程序清单1 9-2中的函数只是用来输出一个H T M L窗体。标记并不包含动作和方法。第19学时 复 杂 窗 体使用221下载图19-4 哪个按钮用于执行哪个操作的示意图浏览器下一页谢谢你提交结果1.将参数“pageone”发送给CGI程序0.没有发送任何参数。第1页输出3.将参数“pagetwo”发送给CGI程序4.CGI程序输出给浏览器5.将参数“pagethree”发送到浏览器6.最后一页输出2.CGI程序输出CG I程序上一页浏览器当没有设定的a c t i o n属性时,当前的C G I程序(即产生窗体的 C G I程序)将在提交窗体时重新加载。当不提交m e t h o d属性时,便使用默认方法G E T。请注意,窗体上的提交按钮的名字是 p a g e o n e。当该窗体被提交时,一个称为 p a g e o n e的参数将被发送到该C G I程序,它的值并不重要。被提交的这个参数将提示 C G I程序加载第二个We b页。程序清单1 9-3是C G I程序的第三部分。程序清单19-3 调查程序的第三部分第4 7行:正如第4 6行中的注释所表示的那样,这一行中的函数用于输出作为隐藏域的该窗体的所有域的值。数据 s u r v e y _ a n s w e r s包含H T M L窗体上所有可能的“n a m e=”值。当第一次运行时,大多数域将不存在,因为调查的这些部分尚未填入相应的的值。第4 8 4 9行:s u r v e y _ a n s w e r s中可能的每个参数均被检查,每个参数均被定义。输出H T M L标号,用于存放当前窗体上的值。第5 6行:这个函数用于输出调查的第二页。第5 7 6 0行:这个函数在调查的第二页中调用。如果调查的第一页填入了正确的值,那么p a r a m(p e t t y p e)将保存d o g或c a t,这个值将存放在$p e t中。如果被调查人跳过了这个问题,同时p a r a m(p e t t y p e)没有定义,那么就改用g o l d f i s h。222使用第三部分将Perl 用于C G I下载第6 1 7 6行:来自第一页的H T M L窗体参数均转入该窗体,作为其隐藏域。如果你在这时查看调查窗体,即它的第二页,那么第一页的所有答案均作为隐藏域存放在第二页的结尾处。程序清单1 9-4显示了第三页的代码。程序清单19-4 调查程序的第四部分函数p a g e _ t h r e e()是非常明了的。它只是输出窗体中的一个文本框和一个文本区域。在结尾处,它再次调用 r e p e a t _ h i d d e n()函数,以便将所有隐藏域放入调查窗体的第三页。程序清单1 9-5显示了C G I调查程序的结尾部分。程序清单19-5 调查程序的最后部分第19学时 复 杂 窗 体使用223下载第9 6行:调用这个函数只是为了输出感谢你的消息。当某人遍历调查窗体的 3个页面后,这样做总是一件很好的事情。然后调用 s a v e()函数。第1 0 3行:这里的s a v e()函数几乎是第1 8学时中的s a v e函数的复制品。它用 g e t _ l o c k()将调用文件锁定,再使用类似r e p e a t _ h i d d e n()中的方法写入对问题的答案,然后用r e l e a s e _ l o c k()函数对文件解锁。你可以随意修改这个调查程序,以适应你自己的需要。它的设计非常灵活,并且可以用于许多不同的目的。19.4 课时小结在本学时中,你学习了如何创建多页 We b窗体的方法。当你进行这项操作时,了解到程序需要解决的几个问题,最重要的是要记住从一页转到另一页时会出现的一些情况。你还学会了如何使用隐藏域将信息存放在服务器无法记住的 We b页上,然后就可以使用隐藏域来创建框架调查窗体了。19.5 课外作业19.5.1 专家答疑问题:H T M L窗体难道一定是如此不顺眼吗?解答:本书中介绍的这些窗体是简单的、缺乏特色的框架式的窗体,有的人称它们是不顺眼的窗体。本书的目的是教你进行 P e r l和C G I编程,而不是教你如何使用 H T M L。实际上,本书中讲到的大多数H T M L程序与标准无关,并且它是不完整的,它没有使用 标记,和标记,也没有D T D标题。通过提供基本的 H T M L,我想你能够对它进行修改,使之符合你的需要。前面讲过,给窗体增色的好办法是查找 We b,寻找你喜欢的窗体。通过查看源代码,你就会对如何将这些We b页组合在一起有个大致的了解。问题:我看到这样一个出错消息:Ca n t find string terminator“x x x x”anywhere beforeEOF at.。这是什么意思?解答:这个错误是因为在程序的某个位置上有一个左引号,但是没有匹配的右引号而造成的。当你使用“here document”时,这意味着无法找到你给“here document”做上结尾标记的单词。它的格式如下:在上面这个例子中,“here document”开头和结尾的单词M A R K必须完全相同。结尾的单224使用第三部分将Perl 用于C G I下载词这一行上,它的前面不能有任何东西,后面也不能有任何东西。M S-D O S和Wi n d o w s的文本编辑器有时并不在程序的最后一行的后面放上行尾符。如果你的“here document”以文件的结尾为结束,请在它的后面放上一个空行。19.5.2 思考题1)为了使你的程序能够记住很长的多页 We b事务处理,你需要使用a.数据库和c o o k i e。b.隐藏的H T M L窗体域。c.隐藏的H T M L窗体域、c o o k i e和数据库的某种组合。2)使用H T M L的标记时,如果不带a c t i o n属性,那么它将a.无法运行。b.导致s u b m i t按钮使用原先生成We b页的C G I程序。c.导致s u b m i t按钮重新加载当前页。3)上面介绍的调查程序有一个小错误,是什么错误?a.printEOP;它在程序清单1 9-2中是个无效语句。b.HTML不完整,因为它不带标记和类似的标记。c.调查程序没有输出结果。19.5.3 解答1)答案可以是b或c。你可以只使用隐藏的H T M L域,也可以只使用c o o k i e。如果只使用数据库,那是不行的。2)答案是 b。重新加载当前页将会删除当前窗体的所有答案。如果没有a c t i o n属性,标记将把当前页的U R L用作替换U R L。3)答案是b。p r i n t E O P;肯定是个有效的语句,它称为“here document”。选择c是不正确的,因为程序不是使用该方法设计的(参见“实习”这一节)。19.5.4 实习 编写一段C G I程序,用于显示调查的结果。也可以创建一个表格,以下面的形式显示这些结果:猫/狗拥有一只夜间活动服装被谁丢弃旅行者有危险吗猫否是普通教授是是两者之一金鱼否专用船长否否狗是否普通玛丽-安尼是是 补充问题,编写一个C G I程序,将调查结果汇总成下面的形式:猫/狗的比例猫 4 0%狗 4 5%其他1 5%拥有该宠物的人猫 2 0%狗 1 5%金鱼 3 0%无 3 5%的比例:夜行者:是 3 5%否 4 0%第19学时 复 杂 窗 体使用225下载