[轉]decorator(HTML裝飾器)

原文地址: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

相關文章
相關標籤/搜索