使用SiteMesh簡化網(wǎng)頁布局
使用SiteMesh簡化網(wǎng)頁布局
?Appfuse帶有SiteMesh對于網(wǎng)頁布局簡化,本文旨在對對Sitemesh的基本原理和在項目中使用Sitemesh的實現(xiàn)流程、使用技巧的介紹。
1.?? 基本原理
SiteMesh 是以 Servlet 2.3API 為基礎。它包含一個引擎,用來解析輸出的網(wǎng)頁或者網(wǎng)頁片段,決定是否需要應用裝飾器以及合并合適的裝飾器。
?????? SiteMesh 與應用內(nèi)容無關,適用的內(nèi)容格式包括 Html 、 JSP 、 Servlet 、 XSL ,甚至 CGI 。
2.?? 實現(xiàn)流程
1)? 當為 Servlet 容器指定一個 Http 請求時, SiteMesh 截取請求,使用一個 Servlet Filter ,然后捕捉 Html 結果。
2)? 然后這個 Html 被解析,并且任何相關的內(nèi)容都被提取到一個 Page 對象中。
3)? 詢問 DecoratorMapper 來確定那一個裝飾器需要被應用。
4)? Servlet 向包含裝飾器的 JSP 發(fā)送請求。
5
)裝飾器生成帶有從
page
對象中獲得的內(nèi)容的
Html
布局。
?
???????? Sitemesh
這樣的好處是,所有具體業(yè)務頁面的開發(fā)者無需考慮該頁面將處在最終輸出頁面的那個位置。無需
include
一大堆頁面,以后如果系統(tǒng)整體改版,那么只需要改寫裝飾器頁面及重新配置裝飾規(guī)則即可完成,方便快捷,可維護性極好。
3.?? 在項目中使用 Sitemesh
1.???????? 將 sitemesh_[version].jar 包加到 WEB-INF\lib 下
2.???????? 在 web.xml 中增加
?
















?
?????? 表示對系統(tǒng)中所有 url 請求均使用 sitemesh Filter 進行攔截。
3.???????? 在 WEB-INF 下配置 sitemesh.xml 和 decorator.xml 配置文件。
Sitemesh.xml
?












































?
Decorator.xml
?
































?
在
sitemesh.xml
中配置了兩個
DecoratorMapper
:
PrintableDecoratorMapper
和
ConfigDecoratorMapper
。
PrintableDecoratorMapper
是供打印專用,在
url
后加上
printable=true
即會使用
decorator.xml
中指定的
printable
裝飾器來對頁面進行裝飾,一般來說打印頁面是只需要打印本頁面的內(nèi)容,其余的如頭、腳、導航欄、左右菜單等是不需要打印的,通過裝飾器可以輕松實現(xiàn)打印頁面的過濾。
4.???????? 創(chuàng)建一個裝飾器 JSP 頁面,我建議所有裝飾器頁面放到 decorators 目錄,并且以 dec[ 功能 ].jsp 作為命名方式,如 decPrintable.jsp 、 decDefault.jsp 。
下面是一個裝飾器的代碼:
?

















?????????? ? < h1 >< decorator:getProperty?property = " page.heading " /></ h1 > ?





?
注意其 <decorator:…> 標簽,這些標簽將被裝飾的 page 頁面的相應內(nèi)容作為屬性傳入。 Page 頁面的相關內(nèi)容將放在 decorator 標簽所指定的位置。
Title :標題
Head :頭部,一般是公共的 js 、 css 及 meta 。
Body :被裝飾的 page 的主體內(nèi)容。
5 、 Sitemesh 通過在 sitemesh.xml 中配置 DecoratorMapper 配置映射器,通過在 decorator.xml 中配置裝飾器文件及其匹配方式。當有頁面需要輸出到客戶端時,將根據(jù)這些配置選擇相應的裝飾器來進行裝飾,將裝飾結果返回給客戶界面。
4.?? 參考資料
關于 Sitemesh 的 api 及詳細使用說明可以參看其官方網(wǎng)站
http://www.opensymphony.com/sitemesh
posted on 2007-01-12 14:24 liaojiyong 閱讀(250) 評論(0) 編輯 收藏 所屬分類: Java