旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

详解XML与当代CGI应用程序的示例代码【XML教程】,XML,CGI,应用程序

作者:搜教程发布时间:2019-11-27分类:XML教程浏览:75评论:0


导读:简介Perl的提高与互联网的蓬勃发展有直接的关联。Perl壮大的功用和轻易扩大的特征使得它成为开辟CGI运用最天然的挑选,并由此迅速地成为CGI剧本的首选言语。CGI自...
简介

Perl的提高与互联网的蓬勃发展有直接的关联。Perl壮大的功用 和轻易扩大的特征使得它成为开辟CGI运用最天然的挑选,并由此迅速地成为CGI 剧本的首选言语。CGI自身并不是完美无缺。但因为取得了浩瀚开辟商的喜爱,CGI 的运用至今依然异常普遍,而且没有迹象表明在近期会“退休”。

典范的CGI::XMLApplication剧本包括三部份:一个很小的供应对该运用 顺序接见支撑的可实行剧本、完成种种管理者要领的逻辑模块、依据运用状况可 能有一个或多个XSLT款式表,XSLT款式表能够将模块返回的效果转化成浏览器可 以向用户显现的花样。

下面我们经由过程例子来简要地引见 CGI::XMLApplication的运用。

例1:CGI XSLT网关

CGI::XMLApplication假定,介入一个项目的设想和开辟人员运用XSLT样 式表星散运用的逻辑和示意,如许能够使这类星散显得异常直接,也不会对项目 带来影响。开辟人员只需能够使setStylesheet返回相符当前运用状况的XSLT款式 表的位置即可。运用竖立的DOM树的转换、XSLT参数向转换引擎的通报、转换后内 容向浏览器的传输对用户而言都是通明的。

为了重点申明这类星散,我们 的第一个例子不是传统意义上的Web运用,而是一个通用的XSLT网关,它能够增添 到服务器的cgi-bin中,将全部XML内容的目次树转化为相符请求的浏览器的花样 ,而这统统关于用户、款式表和文档的作者而言也都是通明的。

第一步是 竖立衔接客户端的要乞降运用的CGI剧本。我们愿望XML文档能够方便地经由过程URL浏 览,并使建立这些文档间的超链接异常直观。因而,我们将建立一个没有扩展名 的CGI剧本,以便将它作为URL途径中的一个节点,节点右侧的一切内容将在包括 XML内容的假造文档环境中举行诠释。在这类情况下,我们将CGI称作是款式表选 择者。

use strict;
use lib '/path/to/secure/webapp/libs';
use XSLGateway;
use CGI qw(:standard);my $q = CGI->new();
my %context = ();
my $gateway_name = 'stylechooser';

在加载适宜的模块和设置 一些在全部剧本局限内有效的变量后,我们最先向被通报给处置惩罚该运用逻辑的类 的%context中增添一些域。在这个运用软件中,我们只传输请求的指向剧本文件 途径右侧的URL(REQUEST条目)和包括有存储在查询参数style中的数据的STYLE 关健字。

$context{REQUEST} = $q->url(-path => 1);
$context{REQUEST} =~ s/^$gateway_name/?//;
$context{REQUEST} ||= 'index.xml';
$context{STYLE} = $q->param ('style') if $q->param('style');

末了,我们 建立了XSLGateway逻辑类的一个实例,并经由过程挪用其run要领处置惩罚请求,将% context作为唯一的参数。

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

CGI剧本就完成了。下面我们建立完成大 部份事情的XSLGateway模块:

package XSLGateway;
use strict;
use vars qw(@ISA);
use CGI::XMLApplication;
use XML::LibXML;
@ISA = qw(CGI::XMLApplication);

象我在简介中 提到的那样,CGI::XMLApplication经由过程事宜挪用起作用:运用顺序类中一个给定 的要领的实行依赖于一个指定域的输入(平常情况下是用来提交表格的按钮的名 字。),必须实行二种挪用要领:selectStylesheet和requestDOM要领。

selectStylesheet返回有关的XSLT款式表的全文件体系途径。为了简朴起 见,我们假定款式表将保存在一个单一的目次中。我们能够经由过程$context-> {STYLE}域供应其他的款式表,从而增添体系的灵活性。

sub selectStylesheet {
my $self = shift;
my $context = shift;
my $style = $context->{STYLE} || 'default';
my $style_path = '/opt/www/htdocs/stylesheets/';
return $style_path . $style . '.xsl';
}

下一步,我们须要 建立requestDOM要领,该要领将返回被传输的XML文档的XML::LibXML DOM表达式 。因为我们的网关只适用于静态文件,我们须要运用XML::LibXML对文档举行剖析 ,并返回效果树。

sub requestDOM {
my $self = shift;
my $context = shift;
my $xml_file = $context->{REQUEST} || '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款式表。下 面我们就能够最先磨练我们的事情效果了。对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')
|| die "database connection couldn't
be initialized: $DBI::errstr n";
my $builder = XML::LibXML::SAX::Builder->new();
my $gen = XML::Generator::DBI->new(Handler => $builder,
dbh => $dbh,
RootElement => 'document',
QueryElement => 'productlist',
RowElement => 'product');
my $dom = $gen->execute($sql) || die "Error Building DOM Treen";
return $dom;}

fetch_recordset要领完成了另一项很主要的使命,但它返回的 DOM树只包括我们想向客户发送信息的一部份,我们还必须猎取用户输入的产物数 量,别的,还须要供应一个订购产物的合计。

sub requestDOM {
my ($self, $context) = @_;
my $root = $context-> {DOMTREE}->getDocumentElement();
my $grand_total = '0';

为了将当前的定货数目作为更大的文档的一部份, 我们将遍历一切的产物元素,并在每行中增添和子元素。的值能够从$context- >{PARAMS}域取得。

foreach my $row ($root->findnodes ('/document/productlist/product')) {
my $id = $row- >findvalue('id');
my $cost = $row->findvalue ('price');
my $quantity = $context->{PARAMS}->{$id} || '0';
my $item_total = $quantity * $cost;
$grand_total += $item_total;
# add the order quantity and item totals to the tree.
$row->appendTextChild('quantity', $quantity);
$row->appendTextChild('item-total', $item_total);
}

末了,我们将增添一些有关定单的元信息 ,要领是在具有元素的根元素中增添一个元素,该元素中包括有当前所选货色的 总价值。

$grand_total ||= '0.00';
my $info = XML::LibXML::Element->new('instance-info');
$info- >appendTextChild('order-total', $grand_total);
$root- >appendChild($info);
return $context->{DOMTREE};
}

仔细的读者能够已注重到,我们这个异常简朴的运用顺序在 order_send要领中没有作任何现实的事。决议怎样处置惩罚这些数据是产物订购运用 顺序中与详细的购物网站最有关的部份。

结束语

CGI::XMLApplication在CGI剧本顺序的编程中供应了一种清楚的、模块化 的断绝体系的内容和示意的要领,单就这一点,就值得我们对它举行一番研讨。 另外,它还能够使我们防止胶葛于一些细节题目,而集中精力处理主要的题目。

【相干引荐】

1. 详解cgi向文本或许数据库写入数据实例代码

2. 分享在IIS上用CGI体式格局运转Python剧本的实例教程

3. 运用CGI模块竖立简朴web页面教程实例

4. 分享一个PythonCGI编程的实例教程

5. 什么是CGI?细致引见Python CGI编程

6. FastCGI 历程不测退出形成500毛病

以上就是详解XML与当代CGI运用顺序的示例代码的细致内容,更多请关注ki4网别的相干文章!

标签:XMLCGI应用程序


欢迎 发表评论: