介紹
SiteMesh: OS(OpenSymphony)的SiteMesh是一個用來在JSP中實現頁面佈局和裝飾(layout and decoration)的框架組件,能夠幫助網站開發人員較容易實現頁面中動態內容和靜態裝飾外觀的分離。通常我們都是用include標籤在每個jsp頁面中來不斷的包含各種header, stylesheet, scripts and footer,現在,在sitemesh的幫助下,我們可以開心的刪掉他們了。
原理
sitemesh通過filter截取request和response,並給原始的頁面加入一定的裝飾(可能爲header,footer…),然後把結果返回給客戶端,並且被裝飾的原始頁面並不知道sitemesh的裝飾,這也就達到了脫耦的目的。
使用
首先是web.xml 配置
<!-- sitemesh 過濾器 -->
<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>/rest/*</url-pattern>
</filter-mapping>
其次還有兩個文件
• sitemesh.xml (可選)
• decorators.xml
sitemesh.xml 可以設置2種信息:
Page Parsers :負責讀取stream的數據到一個Page對象中以被SiteMesh解析和操作。(不太常用,默認即可)
Decorator Mappers : 不同的裝飾器種類,我發現2種比較有用都列在下面。一種通用的mapper,可以指定裝飾器的配置文件名,另一種可打印的裝飾器,可以允許你當用http://localhost/aaa/a.html?printable=true方式訪問時給出原始頁面以供打印(免得把header,footer等的花哨的圖片也搭上)
頁面還可以通過使用ParameterDecoratorMapper在運行時指定要使用的修飾器。
使用ParameterDecoratorMapper,在sitemesh.xml裏追加如下幾行:
<mapper
class= "com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
<param name="decorator.parameter" value="decorator" />
<param name="parameter.name" value="confirm" />
<param name="parameter.value" value="true" />
</mapper>
三個參數的意義分別如下:
•decorator.parameter
指定修飾器所使用的請求參數名。
•parameter.name
確定使用請求修飾器的確認參數名。
•parameter.value
確定使用請求修飾器的確認參數值。
PageDecoratorMapper
頁面可以通過定義META屬性來重載指定修飾自己的修飾器名
要使用這個映射器,需要在sitemesh.xml文件里加入如下幾行:
<mapper
class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
<param name="property.1" value="meta.decorator" />
</mapper>
接下來就是
decorators.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators >
<decorator name="index-common" page="/rest/common/index-common">
<pattern>/rest/index</pattern>
</decorator>
<decorator name="website-decorater" page="/rest/common/website-decorater">
<pattern>/rest/product/gotoWebsiteDev</pattern>
</decorator>
<decorator name="purchaser" page="/rest/common/purchaser">
<pattern>/rest/purchaser/*</pattern>
</decorator>
<decorator name="purchaser-portal" page="/rest/common/purchaser-portal">
<pattern>/rest/purchaser/*</pattern>
</decorator>
<decorator name="no-menu" page="/rest/common/no-menu">
<pattern>/rest/*</pattern>
</decorator>
<decorator name="portal" page="/rest/common/portal">
<pattern>/*</pattern>
</decorator>
<excludes>
<pattern>*.js</pattern>
<pattern>*.css</pattern>
<pattern>*.gif</pattern>
<pattern>*.jpg</pattern>
<pattern><![CDATA[*&none_decorator*]]></pattern>
<pattern><![CDATA[*?none_decorator*]]></pattern>
<pattern><![CDATA[/rest/page/login*]]></pattern>
<pattern><![CDATA[/rest/user/login]]></pattern>
<pattern><![CDATA[/rest/page/401*]]></pattern>
<pattern><![CDATA[/rest/page/404*]]></pattern>
<pattern><![CDATA[/rest/page/500*]]></pattern>
<pattern><![CDATA[/rest/user/toFindPass]]></pattern>
</excludes>
</decorators>
decorator name="portal" page="/rest/common/portal">
<pattern>/*</pattern>
</decorator>
這種前面是名字,後面是請求地址。
@RequestMapping("common/no-menu")
public String noMenu(){
return "common/common-purchaser-no-menu";
}
定位到這個jsp裝飾器界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="decorator"
uri="http://www.opensymphony.com/sitemesh/decorator"%>
<%@ taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%>
<%@ taglib uri="/tld/dict.tld" prefix="dict" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title><decorator:title/> XXXXXXXXXXXXXXXXXX</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/>
<meta name="renderer" content="webkit"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="<dict:domain name='domain.oss.html' />/plugins/reset/reset.css">
<link rel="stylesheet" href="<dict:domain name='domain.oss.html' />/styles/common/common.css">
<link rel="stylesheet" href="<dict:domain name='domain.oss.html' />/styles/common/common-purchaser-no-menu.css">
<script src="<dict:domain name='domain.oss.html' />/plugins/jquery/jquery.min.js"></script>
<decorator:head />
</head>
<body>
<input type="hidden" id="head-nav-id" value=" <c:url value="/rest/common/headNav"/>"/>
<input type="hidden" id="rootUrl" value="<%=request.getContextPath()%>">
<decorator:body />
<div class="copyright">
<div class="inner">
<div class="copyright-text">
<p></p>
<a target="_blank" href="XXXX">
<div class="img-records"></div>
<p class="records-words">XXXXXXXXXXXXXXXXXX</p>
</a>
</div>
</div>
</div>
</body>
</html>
<decorator:title default="裝飾器頁面..." /> //把請求的原始頁面的title內容插入到<title></title>中間。
<decorator:body /> : 把請求的原始頁面的body內的全部內容插入到相應位置。
然後我們在decorator.xml中加入以下描述即可:
<decorator name="main" page="main.jsp">
<pattern>*</pattern>
</decorator>
這樣,請求的所有頁面都會被重新處理
大概就是需要配置的全部內容了。