decorator(HTML裝飾器)
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
插入原始頁面(被包裝頁面)的head標籤中的內容(不包括head標籤本身)。
插入原始頁面(被包裝頁面)的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="<a href="http://www.opensymphony.com/sitemesh/page">http://www.opensymphony.com/sitemesh/page</a>" prefix="page"%>
- <%@ taglib uri="<a href="http://www.opensymphony.com/sitemesh/decorator">http://www.opensymphony.com/sitemesh/decorator</a>" 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>
檔案都寫好之後我們就訪問了:效果如下:
如果感覺不夠詳盡請看這裡:http://hi.baidu.com/%C9%AE_%CC%C6/blog/item/b5731091b4591493a977a488.html
原文出處:http://blog.csdn.net/jzh440/article/details/7770013
相關文章
- 裝飾器模式(Decorator)模式
- decorator-裝飾器
- python 之裝飾器(decorator)Python
- 裝飾器vue-property-decoratorVue
- JavaScript中的裝飾器--DecoratorJavaScript
- python裝飾器decorator的應用Python
- 裝飾模式 (Decorator Pattern)模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- ES6裝飾器Decorator基本用法
- 搭建node服務(四):Decorator裝飾器
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- quarkus依賴注入之八:裝飾器(Decorator)依賴注入
- 設計模式之裝飾器模式(decorator pattern)設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- Decorator裝飾設計模式設計模式
- 學習 ES7 語法 decorator 裝飾器
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- python函式修飾器(decorator)Python函式
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 如何用 Decorator 裝飾你的 TypescriptTypeScript
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- 黃金搭檔 -- JS 裝飾器(Decorator)與Node.js路由Node.js路由
- decorator(修飾器)的業務應用
- 09 結構型模式之裝飾者模式(decorator)模式
- eventbus-cjs 基於JavaScript裝飾器(Decorator)實現的通訊庫JSJavaScript
- 關於Decorator裝飾器模式巢狀包裝的個人的改進設想模式巢狀
- python裝飾器2:類裝飾器Python
- 類裝飾器
- JS裝飾器JS
- Python 裝飾器Python
- Python裝飾器Python
- 設計模式中的俄羅斯套娃:裝飾者(Decorator)模式設計模式
- OpenHarmony裝飾指定自定義元件:@BuilderParam裝飾器元件UI
- 使用 TypeScript 裝飾器裝飾你的程式碼TypeScript
- 裝飾器與後設資料反射(1)方法裝飾器反射
- Javascrip—裝飾器(7)Java
- 1.5.3 Python裝飾器Python
- Python 裝飾器(一)Python
- python的裝飾器Python