Cocoon XSP 2.0快速入门手册


(来源:http://www.sawin.com.cn/doc/sky/xsp.htm)

<本文作者 Blueski />  
<提交日期 2002-2-8/>  

----------------------------------------------------

0 前言

我在国内网页中苦苦搜索,xSP几乎全部被认为是某种internet类型服务提供商的通称,例如,ASP,BSP,ISP,而搜索国外网站,则可以找到较多资料。

这里的XSP则是eXtensible Server Pages技术的简称,和ASP/JSP互相辉映。简而言之,XSP是一种基于Java和XML的能产生动态Web内容的服务器端语言,是一个Web发布框架。在internet应用程序开发中,使用XSP可以实现静态内容、表现形式 和程序逻辑的分离,而这种分离是通过Apache Cocoon实现的。

1 概述

本文将提供以下几方面的内容:
新的基于Java和XML的体系架构的介绍;
XSP和JSP的联系和区别;
XSP语法精要;
XSP在Tomcat和Resin引擎上的安装指南;
一个XSP程序的设计、配置和使用实例。


2 基本知识

2.1 Cocoon介绍

Cocoon是Apache组织的XML项目中的八个子项目之一,而XML项目则是Apache组织的几大项目之一,尽管如此
,Cocoon仍然十分突出和特别的价值。Cocoon的新标志也很特别吧:



图2.1 Cocoon标志


根据Apache官方定义,Cocoon是一项XML发布框架。它允许你定义XML文档和文档的转换,并最终生成你所选择的表 示形式,例如HTML, PDF, SVG, VRML等等。另外,Cocoon使你能够在XML文件中加入处理逻辑,从而是XML管 道具备动态的特性。 
由于Cocoon的改进速度很快,因此各版本会有较大的差异。本文采用版本为cocoon2.0.1,这是目前的最新版本,另外,笔者所用机器的操作系统为Win2K Professional。

2.2 XSP介绍

Cocoon实际上是一个Servlet,因此需要JSP/Servlet引擎的支持,这样的引擎很多,例如tomcat, resin, sliverstream, jrun, weblogic等等。本文将选择目前最新的Tomcat4.0.1和Resin2.0.5分别进行介绍。
XSP和JSP是非常近似的,它们都是基于Java的技术。和JSP相比,XSP的优点在于:

* XSP引擎产生的XML文档可以适应于变化多端的客户端状况。这些动态内容所支持的客户端的浏览器可能是各种各样的。XSP通过Cocoon的协同、转换、运行和输出动态内容,可以实现非常复杂的输出工作。

* 使用XSP的最重要特征就是可以实现静态内容、表现形式和程序逻辑的清晰的分离。如下图所示:



图2.2 XSP实现静态内容、表现形式和程序逻辑的分离

但笔者认为,XSP的不足也在于其技术上的成熟度问题,最新的Cocoon2.0.1刚开始被认为是一个比较成熟的产品。XSP作为一个基于Java和XML的框架,其发展也有待于Java和XML相关技术的进一步发展。另外,作为处于实验中的最新技术,要应用于商业化的开发也存在一定的风险。尽管如此,XSP的前景依然非常迷人。

2.3 XSP工作原理

XSP实际上就是动态的XML文档,XSP的形式有以下3种类型:

2.3.1 嵌入式的XSP

该文件可以.xsp或者.xml结尾。首先静态的XML页被XSP处理器转换成xsp servlet,即全部转换为Java代码,这些程序执行后生成XML文档。然后Cocoon调用xslt处理器,将XML文档转换成html内容并输出。在该文件方式中,<xsp:page>是整个文件的根元素。本文稍后提供的示例也是基于这一类方式。
该过程如下图所示:


图2.3.1 嵌入式的XSP


2.3.2 嵌入逻辑单的XSP

这是被推荐的方式,逻辑代码被另外放在逻辑单文件中,逻辑单通过一些特殊的标记嵌入到XML文档中,经过Cocoon编译后,程序逻辑被插入到XML中,形成XSP文件,在两次转化后动态生成文档输出。通过这种方式,可以更好地体现上述静态内容、表现形式和程序逻辑的清晰的分离。

 

图2.3.2 嵌入逻辑单的XSP

 

2.3.3 带taglib标记库的XSP

在这种方式下,taglib成为了XSP文件的核心库。taglib类同于JSP的taglib, taglib实际上是一些预定义好的库。该类型的工作原理请参看下图所示:


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


图2.3.3 带taglib的XML文件


2.4 XSP语法精要

通俗地说,XSP是在XML静态文档中加入Java程序段后形成的动态XML文档。由于本身就是XML文档,XSP的文件格式严格遵照XML的规范,包括各种XML声明和Cocoon服务器的声明。所有的动态内容都被放在XSP元素(名字空间)中。具体的使用请参考本文中给出的简单示例。

XSP支持以下10种基本元素:
xsp:page  XSP的根元素
xsp:structure 包含类声明
xsp:include 导入缺省类库以外的库文件
xsp:logic 嵌入在XML文档中的程序代码集。
xsp:expr  嵌入在XML文档中的XSP程序片段
xsp:element 动态产生XML元素
xsp:attribute 给指定的XML元素提供属性值
xsp:pi 动态创建Cocoon指令
xsp:comment 注释内容

XSP也有内建对象,主要的对象有10个,request, response, session, servletContext, document, xspGlobal, xspNodeStack, xspCurrentNode, xspParentNode和xspParser对象,有些和其它脚本语言雷同,有些则和XML处理有关,这里不作一一介绍。

3 安装和使用

3.1 说明

我走的可能是最快捷的通道了。如果按照以下步骤进行,应该没有问题。我的机器是Windows2000专业版。
cocoon实际上是一个特别的Servlet,其运行自然需要servlet2.2的支持,而servlet引擎的运行需要Java虚拟机的支持。因此如果按照本文的介绍,则需要下载和配置3部分内容:JDK1.3.1,Tomcat4.0.1和Cocoon2.0.1。

3.2 下载过程

3.2.1 下载JDK,目前的稳定版本是JDK1.3.1,虽然JDK1.4已经在1月23日发布,但Sun目前提供的好象是志愿者版本。
3.2.2 下载tomcat4.0,可从 http://jakarta.apache.org/ 下载。(也可以选择resin2.0.5,如果下载resin2.0.5可去http://www.caucho.com站点)
3.2.3 下载cocoon2.0.1.zip,可从 http://xml.apache.org/ 下载。
以上下载文件均是免费的,不过resin如果用于商业应用则需收费。

3.3 安装过程

3.3.1 安装JDK

执行安装程序,系统将在你的机器上完成安装Java虚拟机,并设置JAVA_HOME到安装路径,classpath参数也包含了JDK目录下的lib中的各jar文件,安装后可以进行一次检查,万一发现系统没有自动设置好,则可以手工设置一下。

3.3.2 安装Tomcat或Resin

3.3.2.1 Tomcat安装:
解压tomcat4.0.1下载文件到所设定目录,执行安装路径下bin\startup.bat,系统将启动apache tomcat服务。在浏览器中执行http://localhost:8080,此时将出现tomcat的欢迎页面,至此表示tomcat已经顺利安装完毕。执行安装路径下bin\shundown.bat,系统将关闭tomcat。

3.3.2.2 Resin安装: 
解压Resiin-2.0.5.zip到所设定目录,执行安装路径下bin\httpd.exe,系统将启动Resin服务。在浏览器中 执行http://localhost:8080,此时将出现Resin的欢迎页面,至此表示Resin已经顺利安装完毕。关闭Resin系统窗口或点击“关闭”按钮即可关闭Resin服务。


3.3 Cocoon安装

3.3.1 解压Cocoon包

解压Cocoon包到某个目录下,打开该目录可以看到一些文档和lisense文件,以及cocoon.war文件,此文件已内含了很多Cocoon组件。Cocoon在Tomcat和Resin下的安装是非常类似的。

3.3.2 Tomcat下的安装

解压cocoon下载文件,关闭Tomcat后,将cocoon.war拷贝到TOMCAT_HOME(Tomcat所安装的路径)/webapps
按2方法重新tomcat,此时系统将解压cocoon.war文件,并进行Cocoon的配置。完成后在webapps目录下出现 Cocoon目录。
此后执行http://localhost:8080/cocoon,将出现cocoon的欢迎页面,至此表示cocoon已经顺利安装完毕。

3.3.3 Resin下的安装

Resin下的Cocoon安装方法和Tomcat如出一辙,也是解压cocoon下载文件,关闭Resin后,将cocoon.war拷贝到RESIN_HOME(Resin所安装的路径)/webapps,重新启动Resin,此时系统将解压cocoon.war文件,并进行Cocoon的配置。完成后在webapps目录下出现 Cocoon目录。
此后执行http://localhost:8080/cocoon,将出现cocoon的欢迎页面,至此表示 cocoon已经顺利安装完毕。

3.3.4 注意事项

需要指出的是,Cocoon在初次启动的时候会比较慢,因为此时系统要把site地图编译成为Java类以改进其Runtime性能。另外,建议采用高版本的Servlet引擎,Tomcat应在4.0以上,Resin在2.0以上,否则安装时只能选用1.0版本的Cocoon,并需用Cocoon的一部分类库取代Servlet引擎的文件才行。

3.4 更为用户化的配置
对于更为用户化的配置,则需要对Cocoon目录下的2个基本配置文件:cocoon.xconf和sitemap.xmap文件进行更多的配置。这2个文件都是XML格式的文件,分别可配置Cocoon所包含的内部组件和站点地图。本文中的例程需要修改sitemap.xmap。

如果需要通过URL访问虚拟路径,即不选择将自己的发布目录放在缺省位置,这可参考Cocoon文档中的FAQ文件,该文件提供了一个简便的设置方法,但需要有Apache服务器的支持。


4 一个简单的XSP实例

在Cocoon安装配置完成以后,可以运行一些系统提供的例程,也可以自己制作XSP程序。本文提供一个简单的程序供参考。

4.1 文件说明

程序名:hello.xsp
转换文件:hello.xsl

4.2 文件清单

4.2.1 hello.xsp


<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML文件头 -->
<!-- www.sawin.com.cn Blueski制作 -->

<!-- 使用Cocoon XSP Processor处理此页面 -->
<?cocoon-process type="xsp"?>

<!-- <xsp:page>展开XSP的页面 -->
<xsp:page
        language="java"
        xmlns:xsp="http://apache.org/xsp"
>

<!-- <xsp:logic>标记定义了业务逻辑 -->
<xsp:logic>

String Hello = "Hello, XSP!";

</xsp:logic>

<!-- 输出 -->
<page>
<xsp:expr>Hello</xsp:expr>
</page>

</xsp:page>

4.2.2 hello.xsl


<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML文件头 -->
<!-- www.sawin.com.cn Blueski制作 -->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!--针对所有标记-->
<xsl:template match="/">

<html>
<body bgcolor="#ffcccc">
<p align="center"><br/><br/><b>
<font size="5" color="navy">
<!--取出<page>标记中的值,进行输出-->
<xsl:value-of select="page" />
</font></b>
</p>
</body>
</html>

</xsl:template>
</xsl:stylesheet>

XSL样式单可以将XML文档进行转换,并输出为指定的样式。

4.3 发布前的配置

首先可将hello.xsp和hello.xsl文件被放在{TOMCAT_HOME}/webapps/cocoon/hello目录中。
此后,需要在sitemap.xmap中进行相应的配置。说来可笑,起先我习惯地用URL对XSP进行访问,但总是遇到404文件资源无法找到的错误,查看错误日志也看不出什么问题。后来才发现sitemap.xmap的作用。我们不妨可以在sitemap.xmap中加入以下标记:


<!-- ================ MyHello =================== -->

<map:match pattern="hello/*">

<map:generate type="serverpages" src="hello/{1}.xsp"/>

<map:transform src="hello/hello.xsl"/>

<map:serialize/>

</map:match>

根据以上的配置,指定了样式单为hello/hello.xsl,并且只要在URL中输入http://localhost:8080/cocoon/hello/hello即可执行hello/hello.xsp文件,并将结果送到浏览器中。同样的,如果该目录下有hello2.xsp,则可通过http://localhost:8080/cocoon/hello/hello2进行调用。
需要注意的是,修改sitemap.xmap后你需要重新启动Tomcat或Resin才能使修改生效,否则你也可以试着修改cocoon.xconf文件中的sitemap标记中的check-reload属性,例如:
<sitemap file="sitemap.xmap" reload-method="asynchron" check-reload="yes" logger="sitemap"/>
这样,当sitemap.xmap修改后,系统将自动发现sitemap的改变并重新将其载入。


4.4 程序运行

配置完成后,以http://localhost:8080/cocoon/hello/hello进行访问,运行结果如下图所示:

图4.4 示例运行结果

以上程序虽然简单,笔者还是花费了将近2天的时间才得其门而入。很多小小的环节,都不得不慢慢地调试,才能得到结果。究其原因,除了笔者对XML研究不深,也因为目前的参考资料大多都是基于1.0版的Cocoon,而2.0版已经有很多改变。

5 后记

最后要说明一下,本文主要是作为学习笔记和交流,让Blueski来编写此文非常合适,因为这可以十分符合“抛砖引玉”的意思吧。顺便还要提一下,我对Cocoon一开始就有些好感,追溯其原因,也许是我比较喜欢荷兰足球明星考库?在前些天刚结束的2001-2002年度荷兰联赛中,埃因霍温队7:2战胜强敌费耶诺德队,其中考库一人独中二元。(-:此是旁话,有些牵强了。:-)

关于XSP的教材,首先Cocoon软件包的Tutorial就不错,网上的例程大多用了它的first.xml。还有必须一提的是希望出版社2002年1月版的《全面引爆--XSP网站开发XSP Cocoon XML核心技术内幕》,我们不能不对作者com工作室和出版社的前瞻性和技术贡献表示赞赏。

本文欢迎转载,只是由于才疏学浅,若有不妥之处则还请多多指正为盼。