什么是SiteMesh?
SiteMesh是OpenSymphony下的一個(gè)項(xiàng)目,是基于PageFilter,Servlet過濾器的通用組件.
SiteMesh為我們帶來什么?
我們可以想像一下,當(dāng)我們的應(yīng)用程序有大量的頁(yè)面時(shí)候,為每個(gè)頁(yè)面include我們各種各樣的標(biāo)簽庫(kù),引入的js和css等樣式,這將會(huì)成為重復(fù)性的工作,而且只要其中一個(gè)標(biāo)簽庫(kù)進(jìn)行了更新升級(jí),所有頁(yè)面的標(biāo)簽聲明都需要重新更改,這項(xiàng)工作無疑是恐怖而且毫無技術(shù)含量的,SiteMesh就是為了幫助我們解決這個(gè)問題,把共有的標(biāo)簽例如js,css,struts-tags等重復(fù)性的聲明抽象到一個(gè)頁(yè)面當(dāng)中,從而實(shí)現(xiàn)集中處理,增加維護(hù)性和解除頁(yè)面間的耦合.
SiteMesh原理:
SiteMesh應(yīng)用了Decorator模式,用filter截取request和response,把頁(yè)面組件head,content,banner結(jié)合為一個(gè)完整的視圖。通常我們都是用include標(biāo)簽在每個(gè)jsp頁(yè)面中來不斷的包含各種header, stylesheet, scripts and footer,現(xiàn)在,在SiteMesh的幫助下,我們可以不再編寫那些重復(fù)性的代碼,從而集中在一個(gè)地方進(jìn)行管理.容器接收到頁(yè)面請(qǐng)求時(shí),會(huì)把請(qǐng)求傳遞給PageFilter,PageFilter收集應(yīng)用程序的響應(yīng)細(xì)節(jié),生成自定義的響應(yīng)對(duì)象,然后連同請(qǐng)求一起傳遞給web應(yīng)用程序.web應(yīng)用程序把響應(yīng)資源寫入到自定義響應(yīng)對(duì)象里,再返回給PageFilter.
SiteMesh使用:
本事例使用基于Struts2來進(jìn)行編寫
1.首先在我們的項(xiàng)目當(dāng)中添加Maven的依賴
- <dependency>
- <groupId>opensymphony</groupId>
- <artifactId>sitemesh</artifactId>
- <version>2.4.2</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.struts</groupId>
- <artifactId>struts2-sitemesh-plugin</artifactId>
- <version>2.2.3</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
2.在web.xml文件中增加如下配置
- <filter>
- <filter-name>sitemesh</filter-name>
- <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
- </filter>
-
- <filter-mapping>
- <filter-name>sitemesh</filter-name>
- <url-pattern>*.action</url-pattern>
- <dispatcher>REQUEST</dispatcher>
- <dispatcher>FORWARD</dispatcher>
- <dispatcher>INCLUDE</dispatcher>
- </filter-mapping>
3.在WEB-INF建立decorators.xml,該文件描述各個(gè)裝飾器頁(yè)面和如何過濾頁(yè)面
- <?xml version="1.0" encoding="UTF-8"?>
-
-
- <!-- defaultdir 屬性為通用頁(yè)面存放的路徑 -->
- <decorators defaultdir="/WEB-INF/content/base">
-
- <!-- excludes 為哪些頁(yè)面不需要進(jìn)行裝飾,這通常結(jié)合popup來使用 -->
- <excludes>
- <pattern>*no-decorate*</pattern>
- <pattern>/login*</pattern>
- </excludes>
-
- <!-- decorator為指定裝飾頁(yè)面的名稱和路徑 -->
- <decorator name="main" page="main.jsp">
- <!-- pattern 為要過濾哪些頁(yè)面? * 代表所有頁(yè)面都進(jìn)行過濾-->
- <pattern>*</pattern>
- </decorator>
-
- <decorator name="printable" page="printable.jsp"/>
- </decorators>
以下為main.jsp代碼
- <!--
- 當(dāng)使用了SiteMesh后,本頁(yè)面main.jsp就會(huì)變成所有頁(yè)面的模板
- 我們可以在這個(gè)頁(yè)面中引入各種的css,js和其他的頁(yè)面,
- 亦可以在這里使用jsp的include標(biāo)簽引入其他的頁(yè)面,
- 更甚者可以在這里設(shè)定全局的js,例如jQuery的$.(document).ajaxStart(function(){})
- -->
- <html>
- <head>
- <!-- decorator:title可以將被過濾的頁(yè)面的title填充到這里 -->
- <title><decorator:title/></title>
- <!-- decorator:head 可以將被過濾的頁(yè)面中的head填充到這里 -->
- <decorator:head />
- </head>
- <body>
- <div class="content">
- <!-- decorator:head 可以將被過濾的頁(yè)面中的body填充到這里 -->
- <decorator:body />
- </div>
總結(jié):
使用了SiteMesh后,更集中的管理了各個(gè)頁(yè)面的標(biāo)簽,css,js的引入,雖然在實(shí)際開發(fā)當(dāng)中一般會(huì)首先固定各個(gè)技術(shù)使用的版本,但由于需求的變更和技術(shù)的更新發(fā)展,有時(shí)候不得不更新所使用的版本,大量分散在不同頁(yè)面的引入標(biāo)簽修改起來簡(jiǎn)直就是噩夢(mèng)般的事情,而且SiteMesh的簡(jiǎn)單易用,我們何樂而不為的去使用SiteMesh呢?
|