1 簡介php
SiteMesh是由一個基於Web頁面佈局、裝飾以及與現存Web應用整合的框架。它能幫助咱們在由大量頁面構成的項目中建立一致的頁面佈局和外觀,如一致的導航條,一致的banner,一致的版權,等等。 它不單單能處理動態的內容,如jsp,php,asp等產生的內容,它也能處理靜態的內容,如htm的內容,使得它的內容也符合你的頁面結構的要求。甚至於它能將HTML文件象include那樣將該文件做爲一個面板的形式嵌入到別的文件中去。全部的這些,都是GOF的Decorator模式的最生動的實現。儘管它是由java語言來實現的,但它能與其餘Web應用很好地集成。html
2 原理java
SiteMesh框架是OpenSymphony團隊開發的一個很是優秀的頁面裝飾器框架,它經過對用戶請求進行過濾,並對服務器向客戶端響應也進行過濾,而後給原始頁面加入必定的裝飾(header,footer等),而後把結果返回給客戶端。經過SiteMesh的頁面裝飾,能夠提供更好的代碼複用,全部的頁面裝飾效果耦合在目標頁面中,無需再使用include指令來包含裝飾效果,目標頁與裝飾頁徹底分離,若是全部頁面使用相同的裝飾器,能夠是整個Web應用具備統一的風格。web
3 demo服務器
<?xml version="1.0" encoding="utf-8"?> <decorators defaultdir="/decorators"> <!-- 此處用來定義不須要過濾的頁面 --> <excludes> </excludes> <!-- 用來定義裝飾器要過濾的頁面 --> <decorator name="main" page="main.jsp"> <pattern>/*</pattern> </decorator> </decorators>
在[web-app]/WEB-INF/web.xml添加如下內容:app
<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>
在[web-app]下建立一個decorators文件夾,在該文件下再建立一個裝飾頁面main.jsp,包含如下內容:框架
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %> <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>AAAAAAAAA<decorator:title default="天佑魔神"/> </title> <decorator:head ></decorator:head> <body> <p>head decorator...</p> <!-- 頭部 --> <decorator:body /> <p>foot decorator...</p><!-- 腳部,能夠寫一些copyright之類的東西 --> </body> </html>
在[web-app]下建立被裝飾頁面hours.jsp,包含如下內容:jsp
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html > <head> <title>Hours</title> </head> <body> <h1>Weekdays</h1> <p>5:00pm - 10:00pm</p> <p>Weekends</p> <p>5:00pm - 10:00pm</p> </body> </html>
4 總結
從以上的例子,能夠看出經過SiteMesh裝飾,不須要在每一個目標頁面中將header和footer等共同文件include進去,被裝飾(目標)頁面和裝飾頁面徹底分離。本文只對SiteMesh作一個簡單的介紹,SiteMesh能夠Velocity,FreeMarker等開源模板工具結合使用,下降頁面開發複雜度。工具