SiteMesh 是一個網頁布局和修飾的架構,利用它可以将網頁的内容和頁面結構分離,以達到頁面結構共享的目的。
它通過對所有的使用者請求進行過濾,并對伺服器向用戶端響應也進行過濾,進而給原始的伺服器響應加入一定的裝飾,可以是header、footer等,然後将經過裝飾後的頁面送回浏覽者。對于被裝飾的頁面而言,它無需知道自身被誰裝飾,也無從知道自身被誰裝飾。
SiteMesh通過配置檔案來配置指定的裝飾器,用于過濾某些頁面,則該裝飾器會裝飾這些頁面,進而提供更好的頁面效果,通過SiteMesh的頁面裝飾,可以提供更好的代碼複用,所有的頁面裝飾效果耦合在目标頁面中,無需使用include指令來顯式包含裝飾效果,目标頁面與裝飾頁面完全分開。提供更好的解耦,而且可以在應用中所有的頁面都使用相同的裝飾頁面,整個Web應用會有更統一的風格,會提供更好的整體效果。
SiteMesh通過Filter來截取request和response,然後給原始的頁面加入一定的裝飾,再把結果傳回給用戶端。
使用SiteMesh的步驟:
1、maven引入:
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
2、在web.xml中增加過濾器:
<!-- Sitemesh -->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、在WEB-INF中建立decorators.xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/layouts/">
<!-- 不需要過濾的請求 -->
<excludes>
<pattern>/static/*</pattern>
<pattern>/remote/*</pattern>
</excludes>
<!-- 定義裝飾器要過濾的頁面 -->
<decorator name="default" page="default.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>
1、在decorator标簽的page屬性是指向的jsp裝飾頁面,下面攔截的/*是真正的普通頁面,要被page指定的頁面所修飾,修飾頁面就是寫了一堆SiteMesh的标簽,然後将pattern标簽上url攔截到的被裝飾頁面的對應裝飾頁面标簽的head和body提取過來填充到裝飾頁面中。
2、excludes标簽下配置的是不需要攔截忽略的url。
3、可以不需要使用<pattern>進行攔截被裝飾頁面,可使用meta進行攔截<meta name="xxx" content="xxx" />
引入了SiteMesh标簽:
<sitemesh:title /> 會自動替換為被過濾頁面的title。
<sitemesh:head /> 會把被過濾頁面head裡面的東西(除了title)放到這裡。
<sitemesh:body /> 被過濾的頁面的body内容會放到這裡。