SiteMesh是一個輕量級的web應用框架,實現了Decorator模式。它的目標是將多個頁面都將引用的jsp頁面經過配置加載到相應的jsp文件中。web
在咱們的項目中,每一個jsp都須要添加兩個top和bottom的jsp來完成某些功能。最笨的方法固然就是在每一個頁面上hard code這些功能的相關代碼,可是這樣的作法實在是不知足DRY的原則。clean code須要咱們最大程度的複用咱們的代碼,減小代碼冗餘。服務器
SiteMesh提供了這樣的解決方案:使用decorator模式來動態的給每一個jsp頁面添加額外的職責。使用了Decorator模式後每一個頁面就能夠專一於解決本頁面要解決的問題,而不須要關心那些全局上須要每一個頁面完成的功能模塊了。app
SiteMesh的工做原理十分簡單:使用一個filter對每一個發送到服務器的請求進行過濾;對照配置文件確認該請求的目標jsp是否知足decorator的條件(是否須要被decorate);對須要decorate的頁面,使用配置文件中指定的裝飾規則把指定的文件(如header,footer等)與目標頁面組合起來,把結果返回給客戶端。框架
詳細的作法是:jsp
1.引入SiteMesh的引用this
<dependency> <groupId>opensymphony</groupId> <artifactId>sitemesh</artifactId> <version>2.4.2</version> </dependency>
2.在web.xml文件中配置filterurl
<filter> <filter-name>sitemesh</filer-name> <filter-class>com.opensymphony.sitemesh.webspp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping>
這樣的配置表明我但願對全部的jsp都進行decoratespa
3.編寫decorators.xmlcode
<decorators defaultdir="/path/to/decorators/file"> <excludes> <pattern>/exclude/specific/kind/of/files/in/this/folder</pattern> </excludes> <decorator name="myDecorator" page="FileNameOfTheDecorateRule"> <pattern>*.jsp</pattern> </decorator> </decorators>
excludes節點定義了哪些在decorator目錄下,可是我又不想其被裝飾的文件。xml
4.編寫定義decorate rules的jsp模板
這裏的decorate rules就是在decorators.xml文件中定義的「myDecorator」,其中詳細定義了對目標文件的裝飾規則。包括:用什麼文件對目標文件進行裝飾,在目標文件的哪一個位置進行裝飾等等。它通常是一個jsp文件,或者說是一個模板。在這個模板中寫入須要decorate的詳細內容,格式規範與普通jsp相同,可是有兩個重要的標籤:
<decorator:head/> <decorator:body/>
當對目標頁面進行裝飾的時候,遇到<decorator:head/>就插入目標文件的<head>部分,遇到<decorator:body/>就插入目標文件的<body>部分。
這樣,根據目標文件的不一樣,就動態的生成了具備相同附加職責的不一樣的頁面。