设为首页收藏本站language 语言切换
查看: 1237|回复: 0
收起左侧

XML和现代CGI应用程序

[复制链接]
发表于 2010-2-25 10:27:00 | 显示全部楼层 |阅读模式
<p >erl的普及与互联网的蓬勃发展有直接的关系。在互联网发展的早期,人们发现仅仅使用静态的HTML文档不能生成有效的交互式环境,于是引进了公用网关接口(CGI)的概念。Perl强大的功能和容易扩充的特性使得它成为开发CGI应用最自然的选择,并由此迅速地成为CGI脚本的首选语言。CGI本身并非十全十美。但由于得到了众多开发商的青睐,CGI的应用至今仍然十分广泛,而且没有迹象表明在近期会“退休”。 <p >CGI::XMLApplication提供了一个基于XML、可以作为传统CGI脚本的模块。典型的CGI::XMLApplication脚本包括三部分:一个很小的提供对该应用程序访问支持的可执行脚本、实现各种管理者方法的逻辑模块、根据应用状态可能有一个或多个XSLT样式表,XSLT样式表能够将模块返回的结果转化成浏览器可以向用户显示的格式。 <p >下面我们通过例子来简要地介绍CGI::XMLApplication的应用。 <p >例1:CGI XSLT网关 <p >CGI::XMLApplication假定,参与一个项目的设计和开发人员使用XSLT样式表分离应用的逻辑和表示,这样可以使这种分离显得非常直接,也不会对项目带来影响。开发人员只要能够使setStylesheet返回符合当前应用状态的XSLT样式表的位置即可。应用建立的DOM树的转换、XSLT参数向转换引擎的传递、转换后内容向浏览器的传输对用户而言都是透明的。 <p >为了重点说明这种分离,我们的第一个例子不是传统意义上的Web应用,而是一个通用的XSLT网关,它可以添加到服务器的cgi-bin中,将整个XML内容的目录树转化为符合请求的浏览器的格式,而这一切对于用户、样式表和文档的作者而言也都是透明的。 <p >第一步是建立连接客户端的请求和应用的CGI脚本。我们希望XML文档能够方便地通过URL浏览,并使创建这些文档间的超链接非常直观。因此,我们将创建一个没有扩展名的CGI脚本,以便将它作为URL路径中的一个节点,节点右边的所有内容将在包含XML内容的虚拟文档环境中进行解释。在这种情况下,我们将CGI称作是样式表选择者。 <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>use strict;use lib '/path/to/secure/webapp/libs';use XSLGateway;use CGI qw(:standard);my $q = CGI-&gt;new();my %context = ();my $gateway_name = 'stylechooser';</ccid_code></pre></td></tr></table></ccid_nobr><p >在加载合适的模块和设置一些在整个脚本范围内有效的变量后,我们开始向被传递给处理该应用逻辑的类的%context中添加一些域。在这个应用软件中,我们只传输要求的指向脚本文件路径右边的URL(REQUEST条目)和包含有存储在查询参数style中的数据的STYLE关健字。 <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>$context{REQUEST} = $q-&gt;url(-path =&gt; 1);$context{REQUEST} =~ s/^$gateway_name\/?//;$context{REQUEST} ||= 'index.xml';$context{STYLE} = $q-&gt;param('style') if $q-&gt;param('style');</ccid_code></pre></td></tr></table></ccid_nobr><p >最后,我们创建了XSLGateway逻辑类的一个实例,并通过调用其run方法处理请求,将%context作为唯一的参数。 <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>my $app = XSLGateway-&gt;new();$app-&gt;run(%context);</ccid_code></pre></td></tr></table></ccid_nobr><p >CGI脚本就完成了。下面我们创建完成大部分工作的XSLGateway模块: <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>package XSLGateway;use strict;use vars qw(@ISA);use CGI::XMLApplication;use XML:ibXML;@ISA = qw(CGI::XMLApplication);</ccid_code></pre></td></tr></table></ccid_nobr><p >象我在简介中提到的那样,CGI::XMLApplication通过事件调用起作用:应用程序类中一个给定的方法的执行依赖于一个指定域的输入(一般情况下是用来提交表格的按钮的名字。),必须执行二种调用方法:selectStylesheet和requestDOM方法。 <p >selectStylesheet返回有关的XSLT样式表的全文件系统路径。为了简单起见,我们假定样式表将保存在一个单一的目录中。我们可以通过$context->{STYLE}域提供其他的样式表,从而增加系统的灵活性。 <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>sub selectStylesheet {my $self = shift;my $context = shift;my $style = $context-&gt;{STYLE} || 'default';my $style_path = '/opt/www/htdocs/stylesheets/';return $style_path . $style . '.xsl';}</ccid_code></pre></td></tr></table></ccid_nobr><p >下一步,我们需要创建requestDOM方法,该方法将返回被传输的XML文档的XML:ibXML DOM表达式。由于我们的网关只适用于静态文件,我们需要使用XML:ibXML对文档进行解析,并返回结果树。 <p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>sub requestDOM {my $self = shift;my $context = shift;my $xml_file = $context-&gt;{REQUEST} || 'index.xml';my $doc_path = '/opt/www/htdocs/xmldocs/';my $requested_doc = $doc_path . $xml_file;my $parser = XML:ibXML-&gt;new;my $doc = $parser-&gt;parse_file($requested_doc);return $doc;}</ccid_code></pre></td></tr></table></ccid_nobr><p align="center"><font color="FF0000" >1</font>23<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-10 15:54 , Processed in 0.167749 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表