cocoon讀[ke'ku:n],繭的意思。
接連看到幾篇文章談cocoon,因其中牽扯術(shù)語太多,看后一頭霧水,遂起學(xué)習(xí)之心。
網(wǎng)上找到很多談cocoon的,IBM : developerWorks 中國網(wǎng)站 的在線教程寫得最棒。下面就是學(xué)習(xí)筆記,覺得有意思就順手記下來了。
以下三行是取源碼的命令。
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic -z3 checkout -r cocoon_20_branch xml-cocoon2
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic logout
管道由一些輸入數(shù)據(jù)以及隨后對它進行的一些處理步驟構(gòu)成。每個處理步驟接受前一步的輸出作為輸入,一直到達管道的末端并產(chǎn)生最終輸出。
Cocoon 包含許多常規(guī)管道組件,根據(jù)在管道中扮演的角色,它們分組成幾種完全不同的類型。
管道輸入 — 生成器(如FileGenerator,HTMLGenerator,DirectoryGenerator)和閱讀器(常用來讀靜態(tài)文件)
處理步驟 — 轉(zhuǎn)換器(如XSLT 轉(zhuǎn)換器)和操作
管道輸出 — 序列化器(如XML,HTML,SVG,PDF序列化器 )
條件的處理 — 匹配器和選擇器
Cocoon 管道通常至少由生成器和序列化器組成,但可能含有任意數(shù)量的處理步驟。將數(shù)據(jù)作為 SAX 事件通過 Cocoon 管道傳遞。
對接收請求和為響應(yīng)提供服務(wù)的邏輯周期如下:
1、從用戶接受請求。
2、確定用來解釋該請求并生成響應(yīng)的適當(dāng)管道(使用匹配器)。
3、從可用的預(yù)配置的組件構(gòu)造管道。
4、指示管道為請求服務(wù)。
5、將由管道生成的響應(yīng)返回用戶,可能對結(jié)果進行高速緩存以便以后使用。
網(wǎng)站地圖(sitemap)兩個功能:
1、聲明組件;
2、定義管道。
XML Server Pages(XSP)編譯過程如下圖:

XSP語法:
1、xsp:page 元素是每個 XSP 文檔的根元素。它必須有一個標(biāo)識該頁面包含的編程語言 — 具體說就是“java”— 的語言屬性。
該頁面元素可能包含:
任意數(shù)目的 xsp:structure 元素
任意數(shù)目的 xsp:logic 元素
單個用戶元素
這最后一個限制非常重要。“用戶元素”表示不在 XSP 名稱空間中的任何元素,包括無名稱空間的元素。之所以有這個限制是因為用戶元素成為由 XSP 頁面創(chuàng)建的 XML 文檔的根元素,而 XML 文檔只能有單個根元素。
2、xsp:structure 和 xsp:include 元素用于向代碼生成過程提供這些附加提示。這兩個元素是一前一后使用的,xsp:structure 元素將許多 xsp:include 元素組合在一起。每個 xsp:include 定義一個要導(dǎo)入的附加 Java 包或類。
3、xsp:logic 元素用于將 Java 代碼塊添加到 XSP。
在這些元素作為 xsp:page 元素的直接子元素出現(xiàn)的任何地方(也就是,單個用戶元素以外),這個代碼塊都應(yīng)包含方法定義和/或成員變量。之所以存在這一點是因為出現(xiàn)在用戶元素以外的代碼不包含在生成器的 generate() 方法內(nèi)。常規(guī)的 Java 語法規(guī)則意味著這個代碼必須是成員或類(也就是,靜態(tài))變量或方法。
xsp:logic 元素也可以使用在 XSP 頁面的其它地方。在這種情況下,它們應(yīng)該包含將被添加到已編譯的生成器中的 generate() 方法的 Java 語句。這使 xsp:logic 元素類似于 JSP 頁面中使用的 <% ... %>scriptlet 語法。
4、CDATA 節(jié),它向 XML 解析器發(fā)出信號以對于那節(jié)內(nèi)容不采用良好格式規(guī)則
<![CDATA[...]]>
5、xsp:expr 元素用于封裝一個表達式,該表達式的值將直接添加到輸出文檔。與此相反,xsp:logic 元素包含生成器的代碼。因此,xsp:expr 元素等價于在 JSP 中實現(xiàn)類似角色的 <%= ... %> 表達式語法。例如:
<elements>
<xsp:logic>
for (int i=1; i<11; i++)
{
<element><xsp:expr>i</xsp:expr></element>
}
</xsp:logic>
</elements>
6、通過使用 xsp:element 生成動態(tài)元素。如:
<xsp:element prefix="my" uri="http://www.examples.org">
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param>
Element content
</xsp:element>
這個示例生成了以下 XML 輸出:
<my:myElementName xmlns:my="http://www.examples.org">Element content</my:myElementName>
7、通過使用 xsp:attribute 生成動態(tài)屬性
<xsp:element>
<xsp:param name="name"><xsp:expr>"myElementName"</xsp:expr></xsp:param>
<xsp:attribute name="myAttribute">myAttributeValue</xsp:attribute>
Element content
</xsp:element>
和(兩個例程沒關(guān)系)
<image>
<xsp:attribute name="href"><xsp:expr>calculateImageURL()</xsp:expr></xsp:attribute>
</image>
8、xsp:comment 和 xsp:pi 元素用于創(chuàng)建注釋和處理指令。
<xsp:comment>This is a comment</xsp:comment>
然后這個注釋變成:
<!-- This is a comment -->
請注意:盡管任何文本將被添加到注釋,但任何嵌套標(biāo)記都被忽略了。
創(chuàng)建處理指令類似于創(chuàng)建動態(tài)元素或?qū)傩?。xsp:pi 元素應(yīng)該有一個標(biāo)識處理指令目標(biāo)的嵌套參數(shù)。照例對 xsp:pi 元素的剩余內(nèi)容求值。這里是一個簡單示例:
<xsp:pi target="myApplication">
<xsp:expr>"param1=value, param2=value, generatorTimestamp=" +
System.currentTimeMillis()</xsp:expr>
</xsp:pi>
輸出如下:
<?myApplication param1=value, param2=value, generatorTimestamp=1017407796870?>
邏輯單是可以被添加到 XSP 頁面的定制元素庫,是通過使用 XSLT 轉(zhuǎn)換實現(xiàn)的。這些轉(zhuǎn)換將附加的代碼塊和/或 XSP 標(biāo)記引入到 XSP 文檔,這樣擴展了產(chǎn)生 Generator 類的能力。
每個邏輯單都與一個特殊的名稱空間關(guān)聯(lián)。使用邏輯單僅僅涉及在 XSP 文檔中聲明相應(yīng)的名稱空間,然后在需要的時候添加來自那個名稱空間的元素。如
<xsp:page language="java"
xmlns:xsp="http://apache.org/xsp"
xmlns:util="http://apache.org/xsp/util/2.0">
<clock>
<day><util:time format="EE"/></day>
<month><util:time format="MMMM"/></month>
<year><util:time format="yyyy"/></year>
<time><util:time format="HH:mm:ss 'on' dd/MM/yyyy"/></time>
</clock>
</xsp:page>
請注意該頁面聲明了實用程序的名稱空間 http://apache.org/xsp/util/2.0,并使用一個附加的元素,而沒有插入任何附加 Java 代碼。當(dāng)對它求值時,這個頁面產(chǎn)生:
<clock>
<day>Fri</day>
<month>March</month>
<year>2002</year>
<time>15:14:27 on 29/03/2002</time>
</clock>
Cocoon 2 提供了許多預(yù)先定義的邏輯單,它們提供大量有用功能,而不必編寫 Java 代碼。根據(jù)這些預(yù)先定義的的邏輯單提供的功能類型,可以對它們進行松散分類:
1、環(huán)境(Environmental)邏輯單 — 提供了對 Cocoon 處理環(huán)境的訪問(例如,請求和響應(yīng)) ,有以下四個:
1)請求(request)邏輯單提供了對請求屬性的訪問,包括對請求參數(shù)、請求方法(例如,GET、POST 等等)以及請求標(biāo)題的訪問。當(dāng)請求參數(shù)的某些方面用于改變輸出文檔的生成時,這個邏輯單就格外有用。
2)響應(yīng)(response)邏輯單提供對與當(dāng)前請求關(guān)聯(lián)的 HTTP 響應(yīng)的限制訪問;它只提供對請求標(biāo)題的訪問。XSP 文檔不能用與 Java Servlet 或 JSP 頁面相同的方法執(zhí)行包含或轉(zhuǎn)發(fā),因為分離問題是 Cocoon 2 體系結(jié)構(gòu)的核心部分。這個功能描述在網(wǎng)站地圖中;XSP 頁面生成 XML 內(nèi)容而不指導(dǎo)處理。
3)會話(session)邏輯單提供了對 HTTP 會話信息的訪問,包括創(chuàng)建和刪除會話以及添加和除去會話屬性的能力。很明顯,這個功能在必須為上下文維護用戶會話的 Web 應(yīng)用程序中是最有用的。Cocoon 2 中的會話管理正好等價于它的 JSP 對手。
4)cookie 邏輯單提供了 cookie 維護功能,諸如添加和除去 cookie、允許優(yōu)先存儲到用戶的瀏覽器中。
2、實用程序邏輯單 — 多用途實用程序代碼(例如,文件包含、日志記錄、發(fā)送郵件等等)
有三個邏輯單,每個邏輯單都提供了一些簡單的實用程序功能。
1)日期和時間
2)日志(log)邏輯單處理用戶請求時,它允許從 XSP 生成器上寫入日志消息。如:
<log:debug>This is a debug message from an XSP generator</log:debug>
還有附加的 info、warn、error 和 fatal-error 元素用于寫其它各種日志語句。
3)發(fā)送郵件(sendmail) 邏輯單包含了一個提供從 XSP 頁面對 JavaMail API 訪問的有用元素,如:
<sendmail:send-mail from="myemail@email.com" to="user@user.com" smtphost="smtphost@email.com">
<xsp:param name="subject"><xsp:expr>"The subject of this email..."</xsp:expr></xsp:param>
<xsp:param name="body"><xsp:expr>"The body of this email..."</xsp:expr></xsp:param>
</sendmail:send-mail>
3、數(shù)據(jù)操作 — 提供了對數(shù)據(jù)驗證和與數(shù)據(jù)庫關(guān)聯(lián)的功能的訪問
有兩個邏輯單屬于該類別,其中的一個提供了比另一個明顯更多的功能。
表單驗證器(form validator)邏輯單從未真正單獨使用。它向 Cocoon 表單驗證器行為(Cocoon Form Validator Action)提供一個整齊的界面。這個行為能夠?qū)?HTML 表單發(fā)送到 Cocoon 應(yīng)用程序的數(shù)據(jù)執(zhí)行基本驗證操作,包括檢查整數(shù)的最小和最大值、檢查字符串的大小以及檢查提供的某些參數(shù)。一個著名功能是能夠測試傳遞的變量是否匹配給定的正則表達式。
驗證的結(jié)果存儲在請求參數(shù)中。驗證器(validator)邏輯單提供了解釋來自 XSP 頁面內(nèi)的這些結(jié)果的方法。這樣允許為用戶動態(tài)生成錯誤消息。
在數(shù)據(jù)被確認為有效之后,下一步是將那個數(shù)據(jù)存儲到數(shù)據(jù)庫中。esql 邏輯單提供了執(zhí)行這一步的方法,并提供了更多的功能,包括選擇、刪除和更新數(shù)據(jù)庫。本質(zhì)上,esql 邏輯單提供了將 SQL 語句直接嵌入到 XSP 文檔的方法。然后這個邏輯單生成相應(yīng)的 JDBC 代碼來實現(xiàn) SQL 操作,這樣通過使用 Cocoon 2 簡化了對數(shù)據(jù)庫數(shù)據(jù)的操作和檢索。
http://hedong.3322.org/1stblog/archives.html