在公司項(xiàng)目使用了 Appfuse ,其帶有 SiteMesh 對(duì)于網(wǎng)頁(yè)布局簡(jiǎn)化讓我感覺(jué)很好用,本文旨在對(duì)對(duì) Sitemesh 的基本原理和在項(xiàng)目中使用 Sitemesh 的實(shí)現(xiàn)流程、使用技巧的介紹。
SiteMesh 是以 Servlet 2.3API 為基礎(chǔ)。它包含一個(gè)引擎,用來(lái)解析輸出的網(wǎng)頁(yè)或者網(wǎng)頁(yè)片段,決定是否需要應(yīng)用裝飾器以及合并合適的裝飾器。
?????? SiteMesh 與應(yīng)用內(nèi)容無(wú)關(guān),適用的內(nèi)容格式包括 Html 、 JSP 、 Servlet 、 XSL ,甚至 CGI 。
?
1)? 當(dāng)為 Servlet 容器指定一個(gè) Http 請(qǐng)求時(shí), SiteMesh 截取請(qǐng)求,使用一個(gè) Servlet Filter ,然后捕捉 Html 結(jié)果。
2)? 然后這個(gè) Html 被解析,并且任何相關(guān)的內(nèi)容都被提取到一個(gè) Page 對(duì)象中。
3)? 詢問(wèn) DecoratorMapper 來(lái)確定那一個(gè)裝飾器需要被應(yīng)用。
4)? Servlet 向包含裝飾器的 JSP 發(fā)送請(qǐng)求。
5 )裝飾器生成帶有從 page 對(duì)象中獲得的內(nèi)容的 Html 布局。
大致流程如下圖:?
???????? Sitemesh 這樣的好處是,所有具體業(yè)務(wù)頁(yè)面的開(kāi)發(fā)者無(wú)需考慮該頁(yè)面將處在最終輸出頁(yè)面的那個(gè)位置。無(wú)需 include 一大堆頁(yè)面,以后如果系統(tǒng)整體改版,那么只需要改寫(xiě)裝飾器頁(yè)面及重新配置裝飾規(guī)則即可完成,方便快捷,可維護(hù)性極好。
1.???????? 將 sitemesh_[version].jar 包加到 WEB-INF\lib 下
2.???????? 在 web.xml 中增加
?????? 表示對(duì)系統(tǒng)中所有 url 請(qǐng)求均使用 sitemesh Filter 進(jìn)行攔截。
3.???????? 在 WEB-INF 下配置 sitemesh.xml 和 decorator.xml 配置文件。
Sitemesh.xml
Decorator.xml
在 sitemesh.xml 中配置了兩個(gè) DecoratorMapper : PrintableDecoratorMapper 和 ConfigDecoratorMapper 。
PrintableDecoratorMapper 是供打印專用,在 url 后加上 printable=true 即會(huì)使用 decorator.xml 中指定的 printable 裝飾器來(lái)對(duì)頁(yè)面進(jìn)行裝飾,一般來(lái)說(shuō)打印頁(yè)面是只需要打印本頁(yè)面的內(nèi)容,其余的如頭、腳、導(dǎo)航欄、左右菜單等是不需要打印的,通過(guò)裝飾器可以輕松實(shí)現(xiàn)打印頁(yè)面的過(guò)濾。
4.???????? 創(chuàng)建一個(gè)裝飾器 JSP 頁(yè)面,我建議所有裝飾器頁(yè)面放到 decorators 目錄,并且以 dec[ 功能 ].jsp 作為命名方式,如 decPrintable.jsp 、 decDefault.jsp 。
下面是一個(gè)裝飾器的代碼:
注意其 <decorator:…> 標(biāo)簽,這些標(biāo)簽將被裝飾的 page 頁(yè)面的相應(yīng)內(nèi)容作為屬性傳入。 Page 頁(yè)面的相關(guān)內(nèi)容將放在 decorator 標(biāo)簽所指定的位置。
Title :標(biāo)題
Head :頭部,一般是公共的 js 、 css 及 meta 。
Body :被裝飾的 page 的主體內(nèi)容。
5 、 Sitemesh 通過(guò)在 sitemesh.xml 中配置 DecoratorMapper 配置映射器,通過(guò)在 decorator.xml 中配置裝飾器文件及其匹配方式。當(dāng)有頁(yè)面需要輸出到客戶端時(shí),將根據(jù)這些配置選擇相應(yīng)的裝飾器來(lái)進(jìn)行裝飾,將裝飾結(jié)果返回給客戶界面。
關(guān)于 Sitemesh 的 api 及詳細(xì)使用說(shuō)明可以參看其官方網(wǎng)站
http://www.opensymphony.com/sitemesh
posted on 2007-03-22 11:14 liaojiyong 閱讀(502) 評(píng)論(0) 編輯 收藏 所屬分類: Other
Powered by: BlogJava Copyright © liaojiyong