1. 程式人生 > >web SiteMesh(頁面裝飾器)

web SiteMesh(頁面裝飾器)

SiteMesh是OpenSymphony團隊開發的JEE框架之一,它是一個非常優秀的頁面裝飾器框架,它通過對所有的使用者請求進行過濾,並對伺服器向客戶端響應也進行過濾,從而給原始的伺服器響應加入一定的裝飾,可以是header,footer等,然後將經過裝飾後的頁面送回瀏覽者.對於被裝飾的頁面而言,它無需知道自身被誰裝飾,也無從知道自身被誰裝飾,SiteMesh通過配置檔案來配置指定的裝飾器,用於過濾某些頁面,則該裝飾器會裝飾這些頁面,從而提供更好的頁面效果,通過SiteMesh的頁面裝飾,可以提供更好的程式碼複用,所有的頁面裝飾效果耦合在目標頁面中,無需使用include指令來顯式包含裝飾效果,目標頁面與裝飾頁面完全分高.提供更好的解耦,而且可以應用中所有的頁面都使用相同的裝飾頁面,整個Web應用會有更統一的風格,會提供更好的整體效果.

  SiteMesh通過Filter來擷取request和response,然後給原始的頁面加入一定的裝飾,再把結果返回給客戶端.

SiteMesh應用

  1. 定義裝飾器頁面

  裝飾器頁面就是一個普通的JSP頁面,但這個頁面包含了一些SiteMesh標籤,看下面的頁面程式碼:

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<html>
<head>
   <title><decorator:title default="第一個裝飾器頁面"/></title>
   <decorator:head/>
</head>
<body>
   SiteMesh<hr>
   <decorator:body />
   <hr>
   <div style="font:9pt" align="center">SiteMesh</div>
</body>
</html>

它與傳統的JSP頁面並沒有太大的區別,它包含了三個SiteMesh標籤:

  1,:將被裝飾頁面的title部分插入該頁面的此處.

  2,:將被裝飾頁面的head部分插入該頁面的此處.

  3,:將被裝飾頁面的body部分插入該頁面的此處.

2. 配置裝飾器頁面

  下面在配置檔案中配置該裝飾器頁面,配置用WEB-INF\decorators.xml檔案,內容如下:

<?xml version="1.0" encoding="GBK"?>
<!-- defaultdir指定裝飾器檔案所在的路徑 -->
<decorators defaultdir="/decorators">
<!-- 指定main裝飾器,該裝飾器使用main.jsp頁面 -->
    <decorator name="main" page="main.jsp">
   <!-- 使用main裝飾器裝飾所有的JSP頁面 -->
        <pattern>*</pattern>
    </decorator>
</decorators>

3. 更復雜的裝飾器頁面

  下面將在裝飾器頁面中使用其他裝飾器,也就是裝飾器頁面中巢狀裝飾器頁面,通過這種方式可以提供更高程度的解耦.在裝飾器頁面中匯入其他裝飾器頁面使用如下標籤:

  看如下的裝飾器頁面程式碼:

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
<html>
<head>
   <title><decorator:title default="SiteMesh的裝飾器頁"/></title>
   <link href="decorators/main.css" rel="stylesheet" type="text/css">
   <decorator:head/>
</head>
<body>
   <table width="100%" height="100%">
    <tr>
     <td valign="top">
      <!-- 引入一個頁面,臨時指定所用的裝飾器 -->
      <page:applyDecorator page="/book.html" name="panel" />
      <page:applyDecorator page="/link.html" name="panel" />
     </td>
     <td width="100%">
      <table width="100%" height="100%">
       <tr>
        <td id="pageTitle">
         <decorator:title/>
        </td>
       </tr>
       <tr>
        <td valign="top" height="100%">
         <decorator:body />
        </td>
       </tr>
       <tr>
        <td id="footer">
         <b>被包含的內容</b><br>
         SithMesh提供頁面裝飾支援
        </td>
       </tr>
      </table>
     </td>
    </tr>
   </table>
</body>
</html>

 從上面的頁面程式碼中可以看到,上面頁面一樣只使用了標籤來匯入被裝飾頁面的標題部分,並不一定是匯入到裝飾器頁面的title部分,可以匯入到任何部分.此面,上面裝飾器頁面還使用了標籤,該標籤用於直接將目標頁面匯入裝飾器頁面,匯入目標頁面時,使用panel裝飾器來裝飾該頁面.這意味著,該裝飾器還依賴於另一個裝飾器:panel,panel裝飾器的頁面程式碼如下

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<p>
<table width=250 border=0 cellpadding=0 cellspacing=0>
   <tr>
    <th class="panelTitle">
     <decorator:title default="小面板頁面" />
    </th>
   </tr>
   <tr>
    <td class="panelBody">
     <decorator:body />
    </td>
   </tr>
</table>
</p>

 這個頁面僅僅定義了一個表格,因為上面定義了兩個裝飾器頁面,因此也需要使用decorator.xml檔案來定義裝飾器頁面,程式碼如下:
<?xml version="1.0" encoding="GBK"?>
 
<decorators defaultdir="/decorators">
    <!-- 在excludes元素下指定的頁面將不會由SiteMesh來裝飾 -->
    <excludes>
        <pattern>/exclude.jsp</pattern>
        <pattern>/exclude/*</pattern>
   <pattern>/document/openCatalogSelect.do</pattern>
    </excludes>
 
<!-- 建立一個名為main的裝飾器,該裝飾器頁面為main.jsp,
      用於裝飾pattern指定的URL的所有頁面-->
    <decorator name="main" page="main.jsp">
        <pattern>/*</pattern>
    </decorator>
 
<!-- 定義一個裝飾器,但該裝飾器預設不裝飾任何頁面 -->
    <decorator name="panel" page="panel.jsp"/>
</decorators>


相關推薦

web SiteMesh頁面裝飾

SiteMesh是OpenSymphony團隊開發的JEE框架之一,它是一個非常優秀的頁面裝飾器框架,它通過對所有的使用者請求進行過濾,並對伺服器向客戶端響應也進行過濾,從而給原始的伺服器響應加入一定

python3之裝飾裝飾實現 下篇

上篇中我們介紹了閉包的用法,同時利用裝飾器實現了為函式新增返回原始資料的功能,那麼它怎麼實現的呢,讓我們揭開它神祕的面紗。 def decorator(f): def wrapper(x,y): print("引數1為:%s,引數2為:%

DisplayPageBoundaries 打開word後自動將頁面間空白隱藏 auto+定時

win strong als when clas auto 定時 今天 自動 每次打開文檔都要鼠標點擊頁面間空白處,將其隱藏 嘗試過在 AutoOpen, AutoExec等宏中添加 ActiveWindow.View.DisplayPageBoundaries = Fal

Learn Python—函數裝飾

結果 註釋 return rom 添加 body urn 簡單 裝飾器 裝飾器 開放封閉原則 開放:對函數的擴展是開放的 封閉:對函數的修改是封閉的 裝飾器的作用 在不更改原函數調用方式的前提下,對原函數添加新功能 # ①引子——為什麽要有裝飾器 為了在不修改原函數的基礎

python自動化--函數閉包函數和裝飾

簡單 自動 clas 技術 閉包函數 class 圖片 分享圖片 log 閉包函數 閉包函數定義,定義在函數內部的函數,特點是;包含對外部作用域而不是對全局作用域名字的引用。該函數就稱之為閉包函數。 簡單裝飾器實現 1,為什麽要使用裝飾器,開放封閉原則,對擴展是開放的,

python函數三 裝飾

view **kwargs get 執行 特殊 對象 sleep ret 值轉換 一。函數名(學名:第一類對象) 函數名本質上就是函數的內存地址。通俗點就是特殊的普通變量 def func(): print(111) func() print(func) # 結果

13、python中的函數閉包與裝飾

屬性 新的 做的 一個 too 實現 inf 高級 器) 一、嵌套函數 函數的內部又再定義另一個函數,這個函數就叫嵌套函數,裏面含函數就叫內部函數。 示例: 二、返回函數 函數可以接收函數對象作為參數,同理函數也能返回一個函數對象作為返回值。

Python入門學習筆記03裝飾

語法糖 替換 開頭 ogg highlight 使用 情況 war \n 裝飾器 裝飾器的本質就是一個函數,它的作用是在不改變被裝飾函數代碼及調用方式的情況下為被裝飾函數加上一些功能,可以說裝飾器對於被裝飾函數來說是完全透明的。裝飾器的實現方式利用了高階函數和嵌套函數,建立

Python全棧開發記錄_第五篇裝飾

  單獨記錄裝飾器這個知識點是因為這個知識點是非常重要的,必須掌握的。 瞭解裝飾器之前要知道三個知識點 作用域,上一篇講到過順序是L->E->G->B 高階函式: 滿足下列其中一種即可稱之為高階函式: a、把一個函式名當做實參傳遞給另一個函式 b、返回值中包含函式

Python 函式修飾符裝飾的使用

1.  修飾符的來源借用一個部落格上的一段敘述:修飾符是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、效能測試、事務處理等。修飾符是解決這類問題的絕佳設計,有了修飾符,我們就可以抽離出大量函式中與函式功能本身無關的雷同程式碼並繼續重用。概括的講,修飾

python中@的一個用法裝飾

之前寫程式碼遇到一個函式的上一行有格式為 @函式名 因此做了一些學習,這玩意叫裝飾器,它用來裝飾一個函式。在Python中允許函式名作為另一個函式的引數,即fun1(fun2),注意不能寫成fun1

使用AlarmManager啟動廣播、服務、頁面Android定時

     AlarmManager是Android中的一種系統級別的提醒服務,它會為我們在特定的時刻廣播一個指定的Intent。而使用Intent的時候,我們還需要它執行一個動作,如startActivity,startService,startBroadcast,才能使I

python 試題:請描述decorator裝飾的用法和它的應用場景,如果可以的話,寫一個decorator

請描述decorator(裝飾器)的用法和它的應用場景,如果可以的話,寫一個decorator 參考答案: 所謂裝飾器就是把函式包裝一下,為函式新增一些附加功能,裝飾器就是一個

頁面裝飾框架-SiteMesh應用Decorator模式

通過SiteMesh的頁面裝飾,可以提高更好的程式碼複用,以下是配置使用的簡單記錄: 1.下載jar包:sitemesh-2.3.jar,將jar複製到lib目錄下 2.web.xml檔案中配置sitemesh的Filter <!-- 配置裝飾器filter --&g

SiteMesh頁面裝飾的配置和使用

1 .  Sitemesh 定義          是一個網頁佈局和修飾的框架,利用它可以將網頁的內容和頁面結構分離,以達到頁面結構共享的目的。   SiteMesh是OpenSymphony團隊開發的JEE框架之一,它是一個非常優秀的頁面裝飾器框架,它通過對所有

草根學Python十六 裝飾逐步演化成裝飾

上一篇文章將通過解決一個需求問題來了解了閉包,本文也將一樣,通過慢慢演變一個需求,一步一步來了解 Python 裝飾器。 首先有這麼一個輸出員工打卡資訊的函式: def punch(): print('暱稱:兩點水 部門:做鴨事業部 上班打卡成

python註解裝飾的用法

code perm 二層 UNC 如果 login decorator print ont 帶參數的要用三層def,第一層寫註解裏的參數,第二層寫函數,第三層寫具體邏輯。 如果是不帶參數的註解,直接使用後兩層即可 def needPermission(permiss

一文搞懂Python函式匿名函式、巢狀函式、閉包、裝飾

## Python函式定義、匿名函式、巢狀函式、閉包、裝飾器 [TOC] #### 函式核心理解 > - 函式也是物件,可以把函式賦予變數 > - 可以把函式當作引數,傳入另一個函式中 > - 可以在函式裡定義函式,函式巢狀 > - 函式的返回值也可以是函式物件,閉包 #### 1. 函式定義 `

c++ 設計模式6 Decorator 裝飾模式

ces 軟件組件 類繼承 通過 write height cte 中間 類型 4. “單一職責”類模式 在軟件組件的設計中,如果責任劃分的不清晰,使用繼承得到的結果往往是隨著需求的變化,子類急劇膨脹,同時充斥著重復代碼,這時候的關鍵是劃清責任。 典型模式代表: Decora

AngularJs-destroy事件 頁面離開事件

userinfo telephone on() function 監聽 user detail ddr troy AngularJs-destroy事件 $scope.$on("$destroy", function() { //清除配置,不