摘要:首先這個(gè)Decorator解釋一下這個(gè)單詞:“裝飾器”,我覺(jué)得其實(shí)可以這樣理解,他就像我們用到的Frame,他把每個(gè)頁(yè)面共有的東西提煉了出來(lái),也可能我們也會(huì)用各種各樣的include標(biāo)簽,將我們的常用頁(yè)面給包括進(jìn)來(lái):比如說(shuō)頁(yè)面的top,bottom這些每個(gè)頁(yè)面幾乎都有,而且都一樣,如果我們?cè)诿總€(gè)頁(yè)面都include,可以發(fā)現(xiàn)我們的程序有很多冗余,重復(fù)。相比之下裝飾器給我們提供了一個(gè)較好的選擇,他在你要顯示的頁(yè)面根本看不出任何include信息,可以說(shuō)完全解耦。
一、SiteMesh介紹
SiteMesh是一個(gè)Java WEB項(xiàng)目的網(wǎng)頁(yè)布局和修飾框架。使用SiteMesh后就不再需要在每個(gè)頁(yè)面中都用<jsp:include>標(biāo)簽引入頁(yè)頭、頁(yè)尾、導(dǎo)航等其他公用頁(yè)面了。
可以將網(wǎng)頁(yè)的內(nèi)容和頁(yè)面結(jié)構(gòu)分離,達(dá)到頁(yè)面結(jié)構(gòu)共享的目的。
頁(yè)面裝飾效果耦合在目標(biāo)頁(yè)面中,無(wú)需使用include指令顯示包含裝飾效果,目標(biāo)頁(yè)面和裝飾頁(yè)面完全分離。
整個(gè)web應(yīng)用可以使用相同的裝飾頁(yè)面,風(fēng)格統(tǒng)一,整體效果更好
SiteMesh通過(guò)Filter攔截請(qǐng)求和響應(yīng),給原始頁(yè)面加入裝飾,再把裝飾后的結(jié)果返回給客戶端。
根據(jù)頁(yè)面URL匹配規(guī)則查找合適的裝飾模板頁(yè)
提取被訪問(wèn)頁(yè)的內(nèi)容,放置到裝飾模板中的適當(dāng)位置。
二、業(yè)務(wù)場(chǎng)景使用
比如常見(jiàn)的就是crm系統(tǒng),左邊的樹(shù)形菜單就是一致的,變化的右邊主體部分(即被裝飾的頁(yè)面)。
三、SiteMesh工作原理
sitemesh應(yīng)用Decorator模式,用filter截取request和response,把頁(yè)面組件head,content,banner、bottom結(jié)合為一個(gè)完整的視圖。通常我們都是用include標(biāo)簽在每個(gè)jsp頁(yè)面中來(lái)不斷的包含各種header, stylesheet, scripts and footer。見(jiàn)下圖
當(dāng)用戶請(qǐng)求home.jsp,并且服務(wù)器處理完畢正準(zhǔn)備返回?cái)?shù)據(jù)之時(shí),它被SiteMesh Fi