对
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
出的产品,信赖度还是值得相信的。