對 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 出的產品,信賴度還是值得相信的。