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 的功能进行验证一下。

IntroCocoon.gif

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>

从输出可以看出这是标准的页面格式

hello_cocoon.JPG

也同时证明了 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 出的产品,信赖度还是值得相信的。