對
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)行驗證一下。
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)的頁面格式
也同時證明了
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)品,信賴度還是值得相信的。
?
?