对 Cocoon 的认识和初步理解(飞刀和雨):
目标 ,了解 cocoon 的框架结构,验证其功能及作用。是否符合手机平台的运作,具有的优势及其不足。
Cocoon 的基础知识 ,(网上资料) cocoon 是一个 XML 发布的框架,它允许你定义 xml 文档和文档的转化,并最终生成你所选择的表示形式, 例如 html, pdf, svg 等等。
XSP 是 Cocoon 的实现方式, XSP 引擎产生的 XML 文档可以适应于各种变化的状况。另外最重要的是可以实现 静态内容, 表现形式,程序逻辑 的清晰分离 。而且, XSP 是 java 和 XML 结合的框架。
步骤 对于 Cocoon 的安装,感觉并不像其他开源的软件那么省事,首先要从 Jakatar 网页上下载 src 码,建议在下载源码之前先看下 doc. 我是在拿到 src 后居然找不到 doc 里提到的 helloworld, 用 ant 进行编译后才看到里面有个 samples 目录。把 webapp 目录倒入自己建的项目中,这里我起的项目名字叫 cocoon. 经过 jsp-server 的自动编译,生成代码后在 url 里打入 http://localhost:8080/cocoon/samples/ 可以看到 cocoon 自带的例子。
对于 java 的版本, cocoon 在文档里提到,最好使用1 .4 的,对于1 . 5以上的 , apache 只是用了个可能有争议来敷衍了一下我们,所以在开发的时候,应当建议使用 1.4JDK ,以免碰到无法解释的问题。而且,用下来,我觉得文档不是很完整,我这边 CocoonInAction 只能看到前几页,后面的就打不开了,不知道是不是本来就是这样的。
对于 cocoon 里的例子,看上去非常的简单
但重起后会出现以下的问题:特别的怪异
Message: The repository home at
F:"eclipse-SDK-3.1.1-win32"eclipse"workspace"cocoon"samples"blocks"jcr"repotest appears to be in use. If you are sure it's not in use please delete the file at
F:"eclipse-SDK-3.1.1-win32"eclipse"workspace"cocoon"samples"blocks"jcr"repotest".lock. Probably the repository was not shutdown properly.
Description: org.apache.avalon.framework.configuration.ConfigurationException: Cannot access configuration information at jndi:/localhost/cocoon/WEB-INF/cocoon.xconf:2150:106
Sender: org.apache.cocoon.servlet.CocoonServlet
Source: Cocoon Servlet
这里得去查下,为何有这样的问题出现。(估计是这个 0 字节的 lock 文件用来锁定用户的操作,每次必删)
在对 Cocoon 进行调试的时候,要注意有些类包并没有带上 source code, 所以想要调试源代码的兄弟们只能边猜边调拉 .^-^ 这些文件包为: components, ojb, faces, forums.
下面让我们对 cocoon 的功能进行验证一下。
1. Cocoon 自带的例子: Samples/hello-world
简单的形式在 Samples.xml 中体现
<samples name="Hello, World!">
<group name="About">
<note>All examples on this page have been created using a single data source, hello.xml file.
</note>
<sample name="XML" href="hello.xml">
Hello world XML document.
</sample>
</group>
</samples>
通过这样标准的 xml 文件,最终解析成需要的输出 html, 注意到上面的一个链接,试着打开下 hello.xml, 更简单的结构,
<page>
<title>Hello</title>
<content>
<para>This is my first Cocoon page!</para>
</content>
</page>
从输出可以看出这是标准的页面格式
也同时证明了 Cocoon 可以支持多种格式的内容。比如, xml, html,xhtml,wml,chtml 等等。
2 .下面开始一个独立的项目。就以 hello 为例。
首先新建一个 web 项目 , 并建一个文件 hello.xsp.
<?xml version="1.0" encoding="iso-8859-1"?>
<?cocoon-process type="xsp"?>
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp">
<xsp:logic>
String Hello="Hello,Cocoon!";
</xsp:logic>
<page>
<xsp:expr>Hello</xsp:expr>
</page>
</xsp:page>
然后建一个转换文件在 hello.xsl
<? xml version = " 1.0 " encoding = "iso-8859-1" ?>
< xsl : stylesheet version = " 1.0 " xmlns : xsl = " http : // www.w3.org /1999/XSL/transform " >
< xsl : template match = " / " >
< html >
< body bgcolor = "#ffcccc" >
< p allign = "center" >< br />< br />< b >
< font size = "5" color = "navy" >
< xsl : value-of select = " page " />
</ font ></ b ></ p >
</ body >
</ html >
</ xsl : template >
</ xsl : stylesheet >
当然这些还是不够的,于是,补上一个 map 文件, hello.xmap 主要就是定义一下源码的位置和引用的位子。这个 xmap 的作用非常重要,这是整个项目中连接 pipline 的数据都定义在这个文件里,
因为在配置 cocoon 上遇到了点障碍,耽搁了一段时间,可能这些也是些刚接触的人会碰到的问题,因此这里把这些都做些详细的介绍下。
Web.xml 里有必须带如下的设置:
<web-app>
<servlet>
<servlet-name>Cocoon</servlet-name>
<display-name>Cocoon</display-name>
<servlet-class>org.apache.cocoon.servlet.CocoonServlet</servlet-class>
<init-param>
<param-name>init-classloader</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>force-property</param-name>
<param-value> org.apache.commons.logging.Log=org.apache.commons.logging.impl.LogKitLogger
</param-value>
</init-param>
<init-param>
<param-name>configurations</param-name>
<param-value>/WEB-INF/cocoon.xconf</param-value>
</init-param>
<init-param>
<param-name>logkit-config</param-name>
<param-value>/WEB-INF/logkit.xconf</param-value>
</init-param>
<init-param>
<param-name>servlet-logger</param-name>
<param-value>access</param-value>
</init-param>
<init-param>
<param-name>cocoon-logger</param-name>
<param-value>core</param-value>
</init-param>
<init-param>
<param-name>log-level</param-name>
<param-value>WARN</param-value>
</init-param>
<init-param>
<param-name>forbidden-deprecation-level</param-name>
<param-value>ERROR</param-value>
</init-param>
<init-param>
<param-name>allow-reload</param-name>
<param-value>no</param-value>
</init-param>
<init-param>
<param-name>enable-uploads</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>overwrite-uploads</param-name>
<param-value>rename</param-value>
</init-param>
<init-param>
<param-name>manage-exceptions</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>enable-instrumentation</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>instrumentation-config</param-name>
<param-value>/WEB-INF/instrumentation.xconf</param-value>
</init-param>
<init-param>
<param-name>container-encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
<init-param>
<param-name>form-encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>webdav</servlet-name>
<display-name>Slide DAV Server</display-name>
<servlet-name>Xindice</servlet-name>
<display-name>Xindice XML-RPC Server</display-name>
<servlet-class>org.apache.xindice.server.XindiceServlet</servlet-class>
<init-param>
<param-name>xindice.configuration</param-name>
<param-value>WEB-INF/xindice.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Cocoon</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Cocoon</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Cocoon</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>css</extension>
<mime-type>text/css</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xml</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xconf</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xmap</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>ent</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
<extension>grm</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
</ web-app >
这些都是 web.xml 里面配置 cocoon 参数所必需的。参考 lenya 后发现其 web.xml ,及其相关的 xconf 文件都是原版照用 cocoon ,因此在改造其功能用于手机平台,大可直接使用其上述列出的参数。这样不容易出现奇怪的问题。
2 对于 xmap 文件的编写,即 xsp 的语法。对于一个熟悉 jsp 的程序员来说,应该不是一个很困难的问题,具体如下。
<xsp:page> XSP 文档的根元素
<xsp:expr> 类似于 <%= ... %> 表达式语法
<xsp:logic> 类似于 <% ... %> 表达式语法
<xsp:include> 类似于 <%@page include ... %> 表达式语法
<xsp:structure> 把许多 include 联系在一起
<xsp:element> 生成动态元素
<xsp:attribute> 生成动态属性
<xsp:comment> 注释 <!-- ...-->
<xsp:pi> 创建处理创建动态元素或属性
因此 xsp 相对不会那么复杂,但是对于其上面那么多参数配置,弄清楚每一个参数的作用,到的确是很费力的一件事情。
总的来说, cocoon 提供了一个多展现层的工具,这对于我们来说,是个很好的东西,对于 wap , jsp 的共存的设备, cocoon 可以方便的实现一套程序,多个转换。但其弱点在于参考资料不多,不详细,碰到问题常常无法查到问题所在,但对于开源软件的龙头 apache 出的产品,信赖度还是值得相信的。