1)web-inf/web.xml中加入filter定義與sitemesh的taglib定義
sitemeshfilter
sitemeshfilter/*
ps:需要放在struts下面:
struts-cleanup
org.apache.struts2.dispatcher.actioncontextcleanup
2)建立web-inf/decorators.xml,在該檔案中配置有哪些模板,以及每個模板具體修飾哪些url,另外也可以配置哪些url不需要模板控制 , decorators.xml的乙個例子如下:
/static/*
/api/*
/*使用sitemesh定義好乙個統一的框架後,程式設計師只需要關注動態的內容部分就可以了,而不需要在每個頁面去單獨的include一堆的footer,left,header之類的公共部分--框架只是乙個工具,存在的目的在於提高生產率,減少重複勞動。
以下是這個sitemsh的裝飾頁面原始碼
<
%@ page
contenttype
="text/html; charset=gbk"
%>
<
%@ taglib
uri=
""prefix
="decorator"
%>
<
html
>
<
head
>
<
title
>
<
decorator:title
default
="裝飾器頁面..."
/>
title
>
<
decorator:head
/>
head
>
<
body
>
<
jsp:include
page
="/header.jsp"
>
jsp:include
>
<
jsp:include
page
="/left.jsp"
>
jsp:include
>
<
decorator:body
/>
<
jsp:include
page
="/footer.jsp"
>
jsp:include
>
body
>
html
>
非常簡潔明瞭,把頁面拆成可復用的元件單元,通過jsp include來引入
實際生產中的問題
做乙個系統,可能有多個模組組成,通常會給每個模組分配乙個namespace或package,如乙個使用者管理系統可能有user和system兩個模組組成,那麼其訪問鏈結很可能是http://localhost:8080/user/userlist.action和http://localhost:8080/system/sysconfig.action,這個時候對於不同模組其對應的左側選單或header部分很可能是不同的,如user模組左側選單是建立使用者,修改密碼,而system模組則是配置系統引數,傳送email等,怎樣用sitemesh來實現對於不同模組載入不同的左側選單的目的呢?通常有兩種方式
1.建立多個decorator,為每個模組都建立乙個單獨的decorator,在decorator裡載入不同的left選單
優勢:配置簡單,理解成本比較小
劣勢:對於絕大數系統來說,多個系統模組的模組一般都是統一的,配置多個decorator意味著建立個裝飾頁面,這些裝飾頁面裡可能95%以上的**都是一樣的,不同點在於include不同的left.jsp檔案
2.乙個decorator,使用動態引數來動態載入哪個left.jps檔案
實現原理:當前請求所在模組作為引數傳遞給sitemesh,sitemesh讀取該引數,並去對應模組載入各自的left.jsp檔案,這樣就存在以下的問題
a)所在模組資訊存放在**?
通常的做法是在動態頁面的元素中新增乙個元素,meta元素其實可以簡單的理解成乙個key-value的資料節點,如在user模組的建立使用者頁面/user/createuser.jsp裡新增
,而在system模組的系統配置頁面/system/sysconfig.jsp頁面新增如下
b)sitemsh怎麼讀?
對於所有的jsp頁面,根據jsp頁面所在的模組不同,也存放為不同的頁面下,這裡做乙個統一的命名約束,對於各個模組的左側選單,都統一命名為left.jsp,其目錄結構如下
/user/
left.jsp
/user/createuser.jsp
/system/
left.jsp
/system/sysconfig.jsp
有了這樣的命名約束後,我們就可以在sitemesh的裝飾頁面做文章了
<
%@ page
contenttype
="text/html; charset=gbk"
%>
<
%@ taglib
uri=
""prefix
="decorator"
%>
<
html
>
<
head
>
<
title
>
<
decorator:title
default
="裝飾器頁面..."
/>
title
>
<
decorator:head
/>
head
>
<
body
>
<
jsp:include
page
="/header.jsp"
>
jsp:include
>
<
span
style
="color:#ff0000;"
>
<
decorator:usepageid=
"thepage"
/>
span
>
<
jsp:include
page
="/<
%=<
span
style="
color
:#ff0000;"
>
thepage.getproperty("meta.modulename")
span
>
%>
/left.jsp"
>
jsp:include
>
<
decorator:body
/>
<
jsp:include
page
="/footer.jsp"
>
jsp:include
>
body
>
html
>
siteMesh使用參考
xmlns xsi version 2.4 sitemesh com.opensymphony.module.sitemesh.filter.pagefilter 30 index.jsp 新增藍色高亮部分。安裝完畢。例子1 test1.jsp taglib uri prefix decorator...
SiteMesh標籤使用說明
itemesh包括兩大標籤庫。decorator tags 被用於建立裝飾器頁面.page tags 被用於從原始內容頁面訪問裝飾器.做乙個簡單的介紹,了解一下各標籤的作用。1.插入原始頁面 被包裝頁面 的head標籤中的內容 不包括head標籤本身 2.插入原始頁面的標籤中的內容 不包括body標...
SiteMesh標籤使用說明
1.插入原始頁面的標籤中的內容。沒有屬性。2.插入原始頁面的標籤中的內容。注釋 裝飾jsp 可以在裝飾頁面body中使用如上語法來獲得被裝飾頁面的事件。3.插入被裝飾頁面的title標籤中的內容 default屬性 當沒有在被裝飾頁面找到title中有內容時此值被插入 4.插入原始頁面的proper...