DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML基礎 >> XML和現代CGI應用程序
XML和現代CGI應用程序
編輯:XML基礎     

 

簡介
Perl的普及與互聯網的蓬勃發展有直接的關系。在互聯網發展的早期,人們發現僅僅使用靜態的HTML文檔不能生成有效的交互式環境,於是引進了公用網關接口(CGI)的概念。Perl強大的功能和容易擴充的特性使得它成為開發CGI應用最自然的選擇,並由此迅速地成為CGI腳本的首選語言。CGI本身並非十全十美。但由於得到了眾多開發商的青睐,CGI的應用至今仍然十分廣泛,而且沒有跡象表明在近期會“退休”。

CGI::XMLApplication提供了一個基於XML、可以作為傳統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樣式表。下面我們就可以開始檢驗我們的工作成果了。對http://localhost/cgi-bin/stylechooser/mydocs/somefile.xml的請求將會使互聯網服務器從/opt/www/htdocs/xmldocs/

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved