分享
 
 
 

Apache Cocoon and XSP

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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.*;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有