XML与现代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';
}

时间: 2024-12-02 03:31:30

XML与现代CGI应用程序的相关文章

XML和现代CGI应用程序

cgi|xml|程序   简介 Perl的普及与互联网的蓬勃发展有直接的关系.在互联网发展的早期,人们发现仅仅使用静态的HTML文档不能生成有效的交互式环境,于是引进了公用网关接口(CGI)的概念.Perl强大的功能和容易扩充的特性使得它成为开发CGI应用最自然的选择,并由此迅速地成为CGI脚本的首选语言.CGI本身并非十全十美.但由于得到了众多开发商的青睐,CGI的应用至今仍然十分广泛,而且没有迹象表明在近期会"退休". CGI::XMLApplication提供了一个基于XML.可

javascript+xml制作的随机抽奖程序源代码

javascript|xml|程序|随机|源代码|抽奖 javascript+xml制作的随机抽奖程序源代码 以下index.html源代码:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

测试 XML Web 服务和应用程序(自MS)

web|xml|程序 测试 XML Web 服务和应用程序 注意:在公开发布的 Visual Studio.NET Beta 2 中可能不提供某些功能. 随着松散耦合的计算和 XML Web 服务的不断增长,各个组织越来越需要能够提供成功解决方案的工具,并且这些解决方案可以满足全球用户的不同需要.Visual Studio.NET 不仅为构建 XML Web 服务和应用程序提供了业界领先的工具,而且其中包括的某些重要功能可以用来测试这些应用程序的可扩展性.性能和功能完整性.应用程序中心测试 (A

Visual Studio .NET使开发人员能够快速地构建和部署XML Web服务和应用程序

visual|web|web服务|xml|程序 Visual Studio .NET使开发人员能够快速地构建和部署XML Web服务和应用程序(2002.02.25)   来自:CSDN    华盛顿莱得蒙德,2002年2月8日 --四年以来,微软一直从事Microsoft .NET(公司下一代XML Web服务和应用程序的理念,它们以无缝的.安全的方式联接了整个互联网上的人.设备和信息)的基础工作.下周,微软将庆祝.NET的一个重要的里程碑--该工具将向全世界发行,通过程序员它将推动下一代的网

嵌入式-cgi登陆程序出错,求大神帮忙

问题描述 cgi登陆程序出错,求大神帮忙 在linux下登陆arm开发板,用html和cgi写登陆程序.点击登陆后,浏览器显示the connection was reset,但是网址也调到了cgi程序的路径.程序应该是没错的.希望各位大神帮帮忙,分析一下到底是哪里出问题了,感激不尽.

MS XML DOM 学习笔记Demo程序

dom|xml|笔记|程序 Demo程序演示了MSXML DOM方式的使用方法 程序将输出以下结果: <?xml version="1.0"?><root version="1.0" company="xxx">        <date>2005-08-01</date>        <book>                <name>UML和模式应用</nam

以xml文件作为数据库的程序一例

xml|程序|数据|数据库   <%...@ Language=VBScript %> <!--#include file="config.asp"--> <%...   f=trim(Request("id"))   biaoti=Request("title")   neirong=Request("neirong")IF biaoti="" then     Respon

搜集整理的对xml文件操作的java程序,基本可以满足基本的操作。

xml|程序 包括生成xml文件,增加删除修改节点,增加修改属性等等.现把我的程序共享,还有我的测试例子,看看大家有什么更好的建议.其中用到了jdom.jar 和xerces-1.2.2.jar ,都是标准的xml解析包.可以从网上下载. /** * $RCSfile: XMLProperty.java,v $ * $Revision: 1.3 $ * $Date: 2002/04/02 21:17:09 $ * * Copyright (C) 1999-2001 CoolServlets, I

xml文件操作的java程序(续)

xml|程序 /**     * helper方法,查找一个指定的元素     *     * @param name 元素名称,格式为 X.Y.Z     * @return Element 如果找到就返回这个元素,否则返回null     */    public Element findOnly(String name)    {        //分解元素的名称        String[] propName = parsePropertyName(name);        Elem