原文地址:https://blog.csdn.net/jzh440/article/details/7770013html
1>:每當遇到一個新的技術,首先我會問本身,這個技術是作神馬的?用這個技術有神馬好處?相比其它方式他的優點在哪裏?我該怎樣實現這個技術?
首先這個Decorator解釋一下這個單詞:「裝飾器」,我以爲其實能夠這樣理解,他就像咱們用到的Frame,他把每一個頁面都有的東東提煉了出來,也可能咱們也會用各類各樣的include標籤,將咱們的經常使用頁面給包括進來:好比說頁面的top,bottom這些每一個頁面幾乎都有,並且都同樣,若是咱們在每一個頁面都include,能夠發現咱們的程序是多嗎的冗餘,重複。相比之下裝飾器給咱們提供了一個較好的選擇,他在你要顯示的頁面根本看不出任何include信息,能夠說徹底解耦。
2>:decorator的原理:
sitemesh應用Decorator模式,用filter截取request和response,把頁面組件head,content,banner、bottom結合爲一個完整的視圖。一般咱們都是用include標籤在每一個jsp頁面中來不斷的包含各類header, stylesheet, scripts and footer.
3>:decorator的實現
首先咱們http://www.opensymphony.com/sitemesh/下載咱們須要的jar包:sitemesh-2.4.jar
在咱們的web.xml中配置以下信息:
<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-INF目錄下新建一個decorators.xml文件(/decorator是你的包裝jsp根路徑在這裏main.jsp和panel.jsp都是包裝jsp,a.jsp,b,jsp是被包裝jsp)
defaultdir: 包含裝飾器頁面的目錄page : 頁面文件名name : 別名role : 角色,用於安全webapp : 能夠另外指定此文件存放目錄Patterns : 匹配的路徑,能夠用*,那些被訪問的頁面須要被裝飾。
<?xml version="1.0" encoding="utf-8" ?>
<decorators defaultdir="/decorator">
<decorator name="main" page="main.jsp">
<pattern>/page/a.jsp</pattern>
<pattern>/page/b.jsp</pattern>
</decorator>
<decorator name="panel" page="panel.jsp"></decorator>
</decorators>
創建咱們的包裝jsp在WEBROOT->decorator下面:這裏有兩個分別是main.jsp和panel.jsp
panel.jsp
<decorator:head />
插入原始頁面(被包裝頁面)的head標籤中的內容(不包括head標籤自己)。
<decorator:body />
插入原始頁面(被包裝頁面)的body標籤中的內容。
<decorator:title [ default="..." ] />
插入原始頁面(被包裝頁面)的title標籤中的內容,還能夠添加一個缺省值。
下面介紹一下<page:applyDecorator name=" " page=" ">
其實這裏是同樣的name指的是咱們要用的包裝器名字也就是在decorator.xml中定義好的,page指的是被包裝頁面。
還有就是<decorator:getProperty property="" [default=""][writeEntireProperty=""]/>
插入原始頁面的property屬性指定的值同名的屬性。
property:指定那個屬性將要被插入
default:若是沒有發現指定的屬性,則插入此值
writeEntireProperty:表示是否將(空格 屬性名=「屬性值」)整個插入,容許時的值是true或yes或1
例以下面例子中的:當你訪問a.jsp時,焦點會定在text上。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>
<decorator:title default="默認包裝器。。。"/>
</title>
<decorator:head/>
</head>
<body>
<hr width="100" color="red"/>
<decorator:body/>
<hr width="100" color="blue"/>
</body>
</html>
main.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title><decorator:title default="裝飾器頁面..." /></title>
<decorator:head />
</head>
<body bgcolor="gray"<decorator:getProperty property="body.onload" writeEntireProperty="true" />>
<page:applyDecorator page="/common/top.jsp" name="panel"/>
<div align="center">
<p><font color="red">this is style's header</font></p>
<decorator:body/>
<p><font color="red">this is style's footer</font></p>
</div>
<page:applyDecorator page="/common/bottom.jsp" name="panel"/>
</body>
</html>
a.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'a.jsp' starting page</title>
</head>
<body onload="document.someform.a.focus();">
<form name="someform">
<font color="red">this is my JSP page. </font><br>
<input type="text" id="a"/>
</form>
</body>
</html>
文件都寫好以後咱們就訪問了
java