jc2cn 原创
apache cocoon and xsp
(bigmouse@peoplemail.com.cn)
=============================
一.介绍
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.*;
闽公网安备 35060202000074号