Cocoon 的認(rèn)識和初步理解(飛刀和雨):

?

目標(biāo) ,了解 cocoon 的框架結(jié)構(gòu),驗證其功能及作用。是否符合手機平臺的運作,具有的優(yōu)勢及其不足。

?

Cocoon 的基礎(chǔ)知識 ,(網(wǎng)上資料) cocoon 是一個 XML 發(fā)布的框架,它允許你定義 xml 文檔和文檔的轉(zhuǎn)化,并最終生成你所選擇的表示形式, 例如 html, pdf, svg 等等。

XSP Cocoon 的實現(xiàn)方式, XSP 引擎產(chǎn)生的 XML 文檔可以適應(yīng)于各種變化的狀況。另外最重要的是可以實現(xiàn) 靜態(tài)內(nèi)容, 表現(xiàn)形式,程序邏輯 的清晰分離 。而且, XSP java XML 結(jié)合的框架。

?

步驟 對于 Cocoon 的安裝,感覺并不像其他開源的軟件那么省事,首先要從 Jakatar 網(wǎng)頁上下載 src 碼,建議在下載源碼之前先看下 doc. 我是在拿到 src 后居然找不到 doc 里提到的 helloworld, ant 進(jìn)行編譯后才看到里面有個 samples 目錄。把 webapp 目錄倒入自己建的項目中,這里我起的項目名字叫 cocoon. 經(jīng)過 jsp-server 的自動編譯,生成代碼后在 url 里打入  http://localhost:8080/cocoon/samples/  可以看到 cocoon 自帶的例子。

?

對于 java 的版本, cocoon 在文檔里提到,最好使用1 .4 的,對于1 . 5以上的 ,   apache 只是用了個可能有爭議來敷衍了一下我們,所以在開發(fā)的時候,應(yīng)當(dāng)建議使用 1.4JDK ,以免碰到無法解釋的問題。而且,用下來,我覺得文檔不是很完整,我這邊 CocoonInAction 只能看到前幾頁,后面的就打不開了,不知道是不是本來就是這樣的。

?

對于 cocoon 里的例子,看上去非常的簡單

但重起后會出現(xiàn)以下的問題:特別的怪異

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

這里得去查下,為何有這樣的問題出現(xiàn)。(估計是這個 0 字節(jié)的 lock 文件用來鎖定用戶的操作,每次必刪)

?

?

在對 Cocoon 進(jìn)行調(diào)試的時候,要注意有些類包并沒有帶上 source code, 所以想要調(diào)試源代碼的兄弟們只能邊猜邊調(diào)拉 .^-^ 這些文件包為: components, ojb, faces, forums.

?

下面讓我們對 cocoon 的功能進(jìn)行驗證一下。

IntroCocoon.gif

1.?????? Cocoon 自帶的例子: Samples/hello-world

簡單的形式在 Samples.xml 中體現(xiàn)

<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>

通過這樣標(biāo)準(zhǔn)的 xml 文件,最終解析成需要的輸出 html,? 注意到上面的一個鏈接,試著打開下 hello.xml, 更簡單的結(jié)構(gòu),

<page>

?<title>Hello</title>

?<content>

? <para>This is my first Cocoon page!</para>

?</content>

</page>

從輸出可以看出這是標(biāo)準(zhǔn)的頁面格式

hello_cocoon.JPG

也同時證明了 Cocoon 可以支持多種格式的內(nèi)容。比如, 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>

然后建一個轉(zhuǎn)換文件在 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 >

當(dāng)然這些還是不夠的,于是,補上一個 map 文件, hello.xmap 主要就是定義一下源碼的位置和引用的位子。這個 xmap 的作用非常重要,這是整個項目中連接 pipline 的數(shù)據(jù)都定義在這個文件里,

因為在配置 ? cocoon 上遇到了點障礙,耽擱了一段時間,可能這些也是些剛接觸的人會碰到的問題,因此這里把這些都做些詳細(xì)的介紹下。

Web.xml 里有必須帶如下的設(shè)置:

?

<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 參數(shù)所必需的。參考 lenya 后發(fā)現(xiàn)其 web.xml ,及其相關(guān)的 xconf 文件都是原版照用 cocoon ,因此在改造其功能用于手機平臺,大可直接使用其上述列出的參數(shù)。這樣不容易出現(xiàn)奇怪的問題。

?

2 對于 xmap 文件的編寫,即 xsp 的語法。對于一個熟悉 jsp 的程序員來說,應(yīng)該不是一個很困難的問題,具體如下。

<xsp:page>? XSP 文檔的根元素

<xsp:expr>? 類似于 <%= ... %> 表達(dá)式語法

<xsp:logic>? 類似于 <% ... %> 表達(dá)式語法

<xsp:include> 類似于 <%@page include ... %> 表達(dá)式語法

<xsp:structure> 把許多 include 聯(lián)系在一起

<xsp:element> 生成動態(tài)元素

<xsp:attribute> 生成動態(tài)屬性

<xsp:comment> 注釋 <!-- ...-->

<xsp:pi> 創(chuàng)建處理創(chuàng)建動態(tài)元素或?qū)傩?/span>

因此 xsp 相對不會那么復(fù)雜,但是對于其上面那么多參數(shù)配置,弄清楚每一個參數(shù)的作用,到的確是很費力的一件事情。

?

總的來說, cocoon 提供了一個多展現(xiàn)層的工具,這對于我們來說,是個很好的東西,對于 wap jsp 的共存的設(shè)備, cocoon 可以方便的實現(xiàn)一套程序,多個轉(zhuǎn)換。但其弱點在于參考資料不多,不詳細(xì),碰到問題常常無法查到問題所在,但對于開源軟件的龍頭 apache 出的產(chǎn)品,信賴度還是值得相信的。

?

?