對(duì)
Cocoon
的認(rèn)識(shí)和初步理解(飛刀和雨):
目標(biāo) ,了解 cocoon 的框架結(jié)構(gòu),驗(yàn)證其功能及作用。是否符合手機(jī)平臺(tái)的運(yùn)作,具有的優(yōu)勢(shì)及其不足。
Cocoon 的基礎(chǔ)知識(shí) ,(網(wǎng)上資料) cocoon 是一個(gè) XML 發(fā)布的框架,它允許你定義 xml 文檔和文檔的轉(zhuǎn)化,并最終生成你所選擇的表示形式, 例如 html, pdf, svg 等等。
XSP 是 Cocoon 的實(shí)現(xiàn)方式, XSP 引擎產(chǎn)生的 XML 文檔可以適應(yīng)于各種變化的狀況。另外最重要的是可以實(shí)現(xiàn) 靜態(tài)內(nèi)容, 表現(xiàn)形式,程序邏輯 的清晰分離 。而且, XSP 是 java 和 XML 結(jié)合的框架。
步驟 對(duì)于 Cocoon 的安裝,感覺并不像其他開源的軟件那么省事,首先要從 Jakatar 網(wǎng)頁(yè)上下載 src 碼,建議在下載源碼之前先看下 doc. 我是在拿到 src 后居然找不到 doc 里提到的 helloworld, 用 ant 進(jìn)行編譯后才看到里面有個(gè) samples 目錄。把 webapp 目錄倒入自己建的項(xiàng)目中,這里我起的項(xiàng)目名字叫 cocoon. 經(jīng)過 jsp-server 的自動(dòng)編譯,生成代碼后在 url 里打入 http://localhost:8080/cocoon/samples/ 可以看到 cocoon 自帶的例子。
對(duì)于 java 的版本, cocoon 在文檔里提到,最好使用1 .4 的,對(duì)于1 . 5以上的 , apache 只是用了個(gè)可能有爭(zhēng)議來敷衍了一下我們,所以在開發(fā)的時(shí)候,應(yīng)當(dāng)建議使用 1.4JDK ,以免碰到無法解釋的問題。而且,用下來,我覺得文檔不是很完整,我這邊 CocoonInAction 只能看到前幾頁(yè),后面的就打不開了,不知道是不是本來就是這樣的。
對(duì)于 cocoon 里的例子,看上去非常的簡(jiǎn)單
但重起后會(huì)出現(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)。(估計(jì)是這個(gè) 0 字節(jié)的 lock 文件用來鎖定用戶的操作,每次必刪)
在對(duì) Cocoon 進(jìn)行調(diào)試的時(shí)候,要注意有些類包并沒有帶上 source code, 所以想要調(diào)試源代碼的兄弟們只能邊猜邊調(diào)拉 .^-^ 這些文件包為: components, ojb, faces, forums.
下面讓我們對(duì) cocoon 的功能進(jìn)行驗(yàn)證一下。
1.?????? Cocoon 自帶的例子: Samples/hello-world
簡(jiǎn)單的形式在 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,? 注意到上面的一個(gè)鏈接,試著打開下 hello.xml, 更簡(jiǎn)單的結(jié)構(gòu),
<page>
?<title>Hello</title>
?<content>
? <para>This is my first Cocoon page!</para>
?</content>
</page>
從輸出可以看出這是標(biāo)準(zhǔn)的頁(yè)面格式
也同時(shí)證明了 Cocoon 可以支持多種格式的內(nèi)容。比如, xml, html,xhtml,wml,chtml 等等。
2 .下面開始一個(gè)獨(dú)立的項(xiàng)目。就以 hello 為例。
首先新建一個(gè) web 項(xiàng)目 , 并建一個(gè)文件 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>
然后建一個(gè)轉(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)然這些還是不夠的,于是,補(bǔ)上一個(gè)
map
文件,
hello.xmap
主要就是定義一下源碼的位置和引用的位子。這個(gè)
xmap
的作用非常重要,這是整個(gè)項(xiàng)目中連接
pipline
的數(shù)據(jù)都定義在這個(gè)文件里,
因?yàn)樵谂渲?/span>
? cocoon
上遇到了點(diǎn)障礙,耽擱了一段時(shí)間,可能這些也是些剛接觸的人會(huì)碰到的問題,因此這里把這些都做些詳細(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 ,因此在改造其功能用于手機(jī)平臺(tái),大可直接使用其上述列出的參數(shù)。這樣不容易出現(xiàn)奇怪的問題。
2 對(duì)于 xmap 文件的編寫,即 xsp 的語法。對(duì)于一個(gè)熟悉 jsp 的程序員來說,應(yīng)該不是一個(gè)很困難的問題,具體如下。
<xsp:page>? XSP 文檔的根元素
<xsp:expr>? 類似于 <%= ... %> 表達(dá)式語法
<xsp:logic>? 類似于 <% ... %> 表達(dá)式語法
<xsp:include> 類似于 <%@page include ... %> 表達(dá)式語法
<xsp:structure> 把許多 include 聯(lián)系在一起
<xsp:element> 生成動(dòng)態(tài)元素
<xsp:attribute> 生成動(dòng)態(tài)屬性
<xsp:comment> 注釋 <!-- ...-->
<xsp:pi> 創(chuàng)建處理創(chuàng)建動(dòng)態(tài)元素或?qū)傩?/span>
因此 xsp 相對(duì)不會(huì)那么復(fù)雜,但是對(duì)于其上面那么多參數(shù)配置,弄清楚每一個(gè)參數(shù)的作用,到的確是很費(fèi)力的一件事情。
總的來說, cocoon 提供了一個(gè)多展現(xiàn)層的工具,這對(duì)于我們來說,是個(gè)很好的東西,對(duì)于 wap , jsp 的共存的設(shè)備, cocoon 可以方便的實(shí)現(xiàn)一套程序,多個(gè)轉(zhuǎn)換。但其弱點(diǎn)在于參考資料不多,不詳細(xì),碰到問題常常無法查到問題所在,但對(duì)于開源軟件的龍頭 apache 出的產(chǎn)品,信賴度還是值得相信的。