jc2cn 原創
Apache Cocoon and XSP
([email protected])
=============================
一.介紹
Apache Cocoon是一個純java的網頁內容發布框架,它答應內容(純數據)、邏輯和表現形式分別放到不同的xml文件中,然后用XSL來將它們組合并顯示出來。這種結構的好處是,表現與內容無關,例如,存放在一個XML文件中的一本書的內容,可以根據表現形式的不同要求,用XSL轉換成Html格式、PDF格式甚至是WML(當然現在WAP不適合看書。。。呵)等不同的形式,而且由于XML的表現無關性,使之作為一種標準的傳輸交換數據格式在B2B(企業-企業)商務活動中以及分布式程序的傳輸交互(例如,SOAP)中有著廣闊的應用。
XSP即Extensible Server Pages的縮寫,它通過在XML文件中加入Java程序來實現商務邏輯,由于XML文件中的數據是通過XSL來表現的,所以XSP做到了把內容與顯示分開。想一想你熟悉的asp、php、jsp是怎么做的?它們是把邏輯代碼插入到HTML頁面中來工作的,也就是說內容與顯示并沒有分開。這很輕易造成麻煩,假如你用這些技術開發過網站就會有體會,必須先等美工人員給你做好了的HTML頁面,然后你嵌入你的那些代碼(假如做的夠久,干脆Ctrl+C and Ctrl+V)。以后美工人員想改點什么還要先抓住你問:“老兄,我動動這塊兒沒事吧?!”。更糟糕的是網站要改版呢?
在用Cocoon構建網站中,工作人員被分為三種:XML文件的編寫者、XSP的編寫者和XSL的編寫者。XML文件的編寫者主要是編寫XML文件格式,DTD或者Schema,這工作相當于通常網站的內容編輯。XSP編寫者就是負責往XML文件中加入Java邏輯代碼,來動態控制內容,這工作相當于通常網站的ASP、PHP、JSP程序編寫者。XSL編寫者負責編寫顯示頁面的XSL文件,也就是通常網站的美工人員,不過這比一般美工人員要求高,因為XSL由模板組成,就是一個個調用XML的相關元素而沒有內容的空架子,這些模板也是有固定語法的,具體怎么回事以后部分能看到。
二.安裝Cocoon
雖然JBuilder6開發環境可以調試Cocoon Web程序,但也許你并不使用JBuilder6,所以下面我介紹一下在Windows2000 PRofessional中的安裝配置過程(以我機器上的目錄為例):
1.JDK
我用的是JBuilder自帶的JDK1.3.1,安裝目錄為c:/jbuilder6/jdk1.3.1/ 。假如你還沒有JDK安裝程序,請到http://java.sun.com去下載一份。
直接安裝。
2.Apache HTTP Server
我用的是PHPTriad for Windows自帶的Apache 1.3.12,安裝目錄為c:/apache/ 。假如你還沒有Apache安裝程序,請到http://www.apache.org去下載一份。
直接安裝,注重修改c:/apache/conf/httpd.conf文件中的port項(大約第211行),假如你有其他HTTP Server比如IIS,請修改此端口值,不要跟IIS沖突。我的port值設定為8000。
3.Tomcat
我用的是JBuilder自帶的Tomcat3.2.3,安裝目錄為c:/jbuilder6/jakarta-tomcat-3.2.3/ 。假如你還沒有Tomcat安裝程序,請到http://jakarta.apache.org去下載一份。
下載 ApacheModuleJServ.dll (還是上面的那個網站),將文件拷貝到c:/apache/modules/ 目錄中。
修改c:/jbuilder6/jakarta-tomcat-3.2.3/conf/tomcat.conf文件,將"LoadModule jserv_module modules/ApacheModuleJServ.dll"前面的"#"去掉(大約第8行),并且將"LoadModule jserv_module libexec/mod_jserv.so"前面加上"#"(大約第13行)。
修改c:/apache/conf/httpd.conf文件,在文件最后加上"include c:/jbuilder6/jakarta-tomcat-3.2.3/conf/tomcat.conf"
右鍵單擊"我的電腦"->"高級"->"環境變量",在"系統變量"中"新建"下面兩個環境變量:"變量名"為"TOMCAT_HOME","變量值"為"c:/jbuilder6/jakarta-tomcat-3.2.3";"變量名"為"JAVA_HOME","變量值"為"c:/jbuilder6/jdk1.3.1"。
4.Cocoon
我用的是JBuilder自帶的Cocoon1.8,安裝目錄為c:/jbuilder6/cocoon/ 。假如你還沒有Cocoon安裝程序,請到http://xml.apache.org去下載一份。
將c:/jbuilder6/cocoon/lib/ 目錄下的所有*.jar文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下面。
將c:/jbuilder6/cocoon/bin/ 目錄下的cocoon.jar 文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下面。
注重:我用的Tomcat版本可以自動檢查c:/jbuilder6/jakarta-tomcat-3.2.3/lib/目錄下的*.jar文件,然后加入到$CLASSPATH中,假如你發現你的Tomcat不支持自動檢查功能,你要手動向tomcat.bat中加入那些拷貝過去的*.jar文件。
在c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/下建立cocoon子目錄,然后在c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/目錄下建立WEB-INF子目錄。
將c:/jbuilder6/cocoon/conf/cocoon.properties文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/中。
將c:/jbuilder6/cocoon/src/WEB-INF/web.xml文件拷貝到c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/中。
修改c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon/WEB-INF/web.xml文件,將其中的conf/cocoon.properties改成WEB-INF/cocoon.properties
修改c:/apache/conf/httpd.conf文件,在最后加上:
Alias /cocoon c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon
<Directory "c:/jbuilder6/jakarta-tomcat-3.2.3/webapps/cocoon">
Options Indexes FollowSymLinks
</Directory>
ApJServMount /cocoon /cocoon
<Location /cocoon/WEB-INF/ >
AllowOverride None
deny from all
</Location>
修改c:/jbuilder6/jakarta-tomcat-3.2.3/conf/server.xml文件,加上:
<Context path="/cocoon" docBase="webapps/cocoon" debug="0" reloadable="true" >
</Context>
最后重新啟動Tomcat和Apache,讓設置生效。
在IE中訪問:http://localhost:8080/cocoon/Cocoon.xml
可以看到Cocoon的一些參數。
三.用java寫XSP的邏輯標簽
先看一個XSP的例子,這是一個簡單的計數器:
---------- counter.xml ----------
<?xml version="1.0" encoding="gb2312" ?>
<?cocoon-process type="xsp"?>
<?cocoon-process type="xslt"?>
<?xml-stylesheet href="counter.xsl" type="text/xsl"?>
<xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core">
<xsp:logic>
private static int nCounter = 0;
private synchronized int getCounter()
{
return nCounter++;
}
</xsp:logic>
<counter>
<p>
訪問:<xsp:eXPr>getCounter()</xsp:expr>(次)
</p>
</counter>
</xsp:page>
---------- counter.xsl ----------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="counter">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
下面分析一下上面counter.xml文件中每條語句的意思:
<?xml version="1.0" encoding="gb2312"?>
這個就不用說了吧?XML文件都必須包含的部分,XSP是一個XML文件,當然也不能少了它。這里使用GB2312字符集,以便在代碼中顯示中文字符。
<?cocoon-process type="xsp"?>
這個處理指令指示cocoon使用XSP來處理此XML文件。
<?cocoon-process type="xslt"?>
<?xml-stylesheet href="counter.xsl" type="text/xsl"?>
這個處理指令指示cocoon使用counter.xsl文件來轉換顯示此XML文檔,對XML文件進行XSLT不是必需的。
<xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core">
每個XSP文件都必須包含xsp:page,這是XSP的根元素。同時也必須指定名字空間。而language屬性不是必需的,它指定處理邏輯部分使用的語言,默認值為java語言。注重:xsp:page必須包含一個XML文件的根元素,上面代碼它包含的根元素是counter。
<xsp:logic></xsp:logic>
這個標簽包含的就是XSP的邏輯部分。XSP默認的引入(import)了很多常見的java類(具體是什么看后面的說明),所以你可以直接寫java代碼,而不必import需要的包和類了。但是假如想引入某個類,可以在xsp:strUCture中嵌套xsp:include來實現,比如:
<xsp:structure>
<xsp:include>java.util.Vector</xsp:include>
</xsp:structure>
這就相當于import java.util.Vector
<xsp:expr>getCounter()</xsp:expr>
這個標簽是求表達式的值,然后顯示出來,這是自動做類型轉換的。它將此值作為輸出XML文件中一個節點的text值存放的。另外,有時候需要在xsp:logic中嵌套著使用xsp:expr,以使xsp:expr輸出的內容作為一個節點,這時候你不能直接把xsp:expr放到xsp:logic中,而是將xsp:expr放到xsp:context中,然后再嵌入到xsp:logic中,像下面這樣:
<xsp:logic>
<td>
for (int i = 0; i < parameterValues.length; i++)
{
<xsp:content>
<xsp:expr>parameterValues[i]</xsp:expr>
</xsp:content>
<br/>
}
</td>
</xsp:logic>
注重:其中"<"需要轉換成<以避免XML解析錯誤。這通常在寫程序時候很麻煩,因為你會經常用到">","<"等等需要轉換的符號。你可以將要轉換的內容放到<![CDATA ]]> 標簽中,這樣XML就會不處理其中的內容,所以上面代碼可以這么寫:
<xsp:logic>
<td>
<![CDATA[ for (int i = 0; i < parameterValues.length; i++) ]]>
{
<xsp:content>
<xsp:expr>parameterValues[i]</xsp:expr>
</xsp:content>
<br/>
}
</td>
</xsp:logic>
還要注重的是,一個非空元素不能被xsp:logic截斷。比如上面的代碼,假如<td>寫到xsp:logic外面,就是不正確的:
<!-- 這個td元素是非空的,而且被xsp:logic截斷了 -->
<td>
<xsp:logic>
<![CDATA[ for (int i = 0; i < parameterValues.length; i++) ]]>
{
<xsp:content>
<xsp:expr>parameterValues[i]</xsp:expr>
</xsp:content>
<br/>
}
</xsp:logic>
</td>
這只是非常簡單的應用,Cocoon附帶了很多例子,建議你看看。上面是用java代碼在邏輯標簽中實現動態內容的,也許你并不熟悉java語言,這并不代表你不能使用XSP。因為XSP還提供了標簽庫功能,通過使用標簽庫這樣你甚至不懂編程語言也能用標簽庫來建立XSP頁面。關于標簽庫的使用和XSP其他一些問題下次介紹吧!
--------- 附 -------------
下面這些java類被自動引入:
java.io.*;
java.util.*;
org.w3c.dom.*;
org.xml.sax.*;
javax.servlet.*;
javax.servlet.http.*;
org.apache.cocoon.parser.*;
org.apache.cocoon.producer.*;
org.apache.cocoon.framework.*;
org.apache.cocoon.processor.xsp.*;
新聞熱點
疑難解答