盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

XML与现代CGI应用程序

时间:2025/1/7作者:未知来源:盾怪网教程人气:

[摘要]'index.xml';my doc_path = '/opt/www/htdocs/xmldocs/';my requested_doc = doc_path . ...
'index.xml';
my $doc_path = '/opt/www/htdocs/xmldocs/';
my $requested_doc = $doc_path . $xml_file;

my $parser = XML::LibXML->new;
my $doc = $parser->parse_file($requested_doc);
return $doc;
}

至此,我们的CGI脚本已经可以安全地在服务器的cgi-bin目录中安全地运行了,并在一些适当的目录中上载一些XML文档和一个或二个XSLT样式表。下面我们就可以开始检验我们的工作成果了。对http://localhost/cgi-bin/stylechooser/mydocs/somefile.xml的请求将会使互联网服务器从/opt/www/htdocs/xmldocs/目录中选取mydocs/somefile.xml文件,使用/opt/www/htdocs/stylesheets/中的样式表default.xsl对该文件进行转换,并将它传输给客户。

如果需要,我们可以扩充这一基本的框架,例如,可以在样式表选择CGI脚本程序添加一些查找组件,选择合适的样式表,可以设置或读取HTTP cookies,对网站进行修饰。

例2:一个简单的购物系统
在该例子中,我们将使用CGI::XMLApplication创建一个简化的Web应用程序,购物系统。

与上个例子相同,这个应用程序中与CGI-BIN有关的部分仍然非常地少。我们所需要作的只不过是初始化CustomerOrder应用类并调用它的run()方法。这次,我们将CGI.pm中Vars作为%context的PARAMS域:

use strict;
use CGI qw(:standard);
use lib '/path/to/secure/webapp/libs';
use CustomerOrder;
my $q = CGI->new();
my %context = ();
$context{PARAMS} = $q->Vars;

my $app = CustomerOrder->new();
$app->run(%context);

在这个例子中,我们假定该应用中的产品信息存储在关系数据库中,产品清单不是太长,使我们在应用中不会出现多屏才能显示相关信息的麻烦:用户输入订购的产品数量的主要数据输入屏,显示订购单内容和所选物品总价格的确认屏,显示订单已经处理的提示。为了简单起见,我们在这里没有涉及送货和财务数据的输入等问题。

package CustomerOrder;

use strict;
use vars qw(@ISA);
use CGI::XMLApplication;
use XML::LibXML::SAX::Builder;
use XML::Generator::DBI;
use DBI;

@ISA = qw(CGI::XMLApplication);

在加载必要的模块和定义从CGI::XMLAplication中继承的类后,我们开始创建应用中与各种状态有关的事件调用。首先,我们必须通过创建registerEvents()方法注册这些事件。在本例中,我们将注册order_confirm 和order_send方法,这二个方法设置%context中的SCREENSTYLE域。稍后,我们将利用该属性定义在显示客户端的数据时应该使用三个XSLT样式表中的哪一个。

需要注意的是,这些事件将被映射到实现它们的实际的子程序中,子程序的命名规则是event_<事件名>,例如,order_confim事件是由event_order_confim执行的。另外,还需要注意的是,各种事件的选择是由CGI::XMLApplication根据其查找一个与注册事件同名的表格参数的能力进行的。例如,要执行order_confirm事件,表格组件中必须包含一个提交非空值的名字为order_confirm的表格域。

# 事件的注册和事件调用

sub registerEvents {
return qw( order_confirm order_send );
}

sub event_order_confirm {
my ($self, $context) = @_;
$context->{SCREENSTYLE} = 'order_confirm.xsl';
}

sub event_order_send {
my ($self, $context) = @_;
$context->{SCREENSTYLE} = 'order_send.xsl';
}

如果没有请求执行其他的事件,则缺省地执行event_default。在本例中,我们只使用它将SCREENSTYLE域设定为一个合适的值。

sub event_default {
my ($self, $context) = @_;
$context->{SCREENSTYLE} = 'order_default.xsl';
}

每次请求都会执行event_init方法,而且总是在其他方法之前执行它,这使得它非常适合对应用中被其他事件使用的部分进行初始化。在本例中,我们使用它返回利用fetch_recordset()方法从数据库中获取的产品信息的、最初的DOM树。

sub event_init {
my ($self, $context) = @_;
$context->{DOMTREE} = $self->fetch_recordset();
}

state-handler方法完成后,我们需要执行必需的selectStylesheet和requestDOM方法。

与在第一个例子中一样,我们假设所有的应用的样式表都存储在服务器上相同的目录中。我们所需要作的是返回$context->{SCREENSTYLE}的值所指定的路线,并添加到末尾。

# app config and helpers
sub selectStylesheet {
my ($self, $context) = @_;
my $style = $context->{SCREENSTYLE};
my $style_path = '/opt/www/htdocs/stylesheets/cart/';
return $style_path . $style;
}

在研究requestDOM处理程序之前,我们先来详细地研究fetch_recordset helper方法。

需要记住的是,我们要做的工作是从一个关系数据库中选择所订购产品的有关信息,但传递给XSLT处理器的数据必须是DOM树。在本例中,我们不通过编程的方法,而是利用XML::Generator::DBI,它能够从执行SQL SELECT语句得到的数据中生成SAX数据。创建要求的DOM树就是建立XML::LibXML::SAX::Builder(它从SAX事件中创建XML::LibXML DOM树)的实例。

sub fetch_recordset {
my $self = shift;
my $sql = 'select id, name, price from products';

my $dbh = DBI->connect('dbi:Oracle:webclients',
'chico',
'swordfish')

关键词:XML与现代CGI应用程序




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版