Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks

          sitemesh是opensymphony團(tuán)隊(duì)開發(fā)的j2ee應(yīng)用框架之一,旨在提高頁(yè)面的可維護(hù)性和復(fù)用性。opensymphony的另一個(gè)廣為人知的框架為webwork是用作web層的表示框架。他們都是開源的,可以在www.sf.net下找到。

          應(yīng)用于以下大項(xiàng)目的例子:http://opensource.thoughtworks.com/projects/sitemesh.html

          簡(jiǎn)介:
          sitemesh應(yīng)用Decorator模式,用filter截取request和response,把頁(yè)面組件head,content,banner結(jié)合為一個(gè)完整的視圖。通常我們都是用include標(biāo)簽在每個(gè)jsp頁(yè)面中來(lái)不斷的包含各種header, stylesheet, scripts and footer,現(xiàn)在,在sitemesh的幫助下,我們可以開心的刪掉他們了。如下圖,你想輕松的達(dá)到復(fù)合視圖模式,那末看完本文吧。

           

          hello sitemesh:
          1. 在WEB-INF/web.xml中copy以下filter的定義:
            <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><taglib>     <taglib-uri>sitemesh-decorator</taglib-uri>     <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location></taglib><taglib>     <taglib-uri>sitemesh-page</taglib-uri>     <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location></taglib>

          2. copy所需jar和dtd文件至相應(yīng)目錄,訪問opensymphony.sourceforge.net的cvs以獲取sitemesh最新版本。
            sitemesh.jar WEB-INF/lib
            sitemesh-decorator.tld WEB-INF
            sitemesh-page.tld WEB-INF

          3. 建立WEB-INF/decorators.xml描述各裝飾器頁(yè)面(可仿照sitemesh例子)。
            <decorators defaultdir="/_decorators">       <decorator name="main" page="main.jsp">           <pattern>*</pattern>       </decorator></decorators>



          4. 建立裝飾器頁(yè)面 /_decorators/main.jsp
            <%@ page contentType="text/html; charset=GBK"%><%@ taglib uri="sitemesh-decorator" prefix="decorator" %><html>     <head>       <title><decorator:title default="裝飾器頁(yè)面..." /></title>       <decorator:head />     </head>     <body>       sitemesh的例子<hr>       <decorator:body />       <hr>chen56@msn.com     </body></html>


          5. 建立一個(gè)的被裝飾頁(yè)面 /index.jsp(內(nèi)容頁(yè)面)
            <%@ page contentType="text/html; charset=GBK"%><html>     <head>       <title>Agent Test</title>     </head>     <body>       <p>本頁(yè)只有一句,就是本句.</p>     </body></html>

          最后訪問index.jsp,將生成如下頁(yè)面:

          而且,所有的頁(yè)面也會(huì)如同index.jsp一樣,被sitemesh的filter使用裝飾模式修改成如上圖般模樣,卻不用再使用include標(biāo)簽。

          裝飾器     decorator概念
          建立可復(fù)用的web應(yīng)用程序,一個(gè)通用的方法是建立一個(gè)分層系統(tǒng),如同下面一個(gè)普通的web應(yīng)用:
          • 前端,front-end:JSP和Servlets,或jakarta的velocity
          • 控制層框架 Controller : (Struts/Webwork)
          • 業(yè)務(wù)邏輯 Business :主要業(yè)務(wù)邏輯
          • 持久化框架 :hibernate/jdo

          可糟糕的是前端的頁(yè)面邏輯很難被復(fù)用,當(dāng)你在每一個(gè)頁(yè)面中用數(shù)之不盡的include來(lái)復(fù)用公共的header, stylesheet, scripts,footer時(shí),一個(gè)問題出現(xiàn)了-重復(fù)的代碼,每個(gè)頁(yè)面必須用copy來(lái)復(fù)用頁(yè)面結(jié)構(gòu),而當(dāng)你需要?jiǎng)?chuàng)意性的改變頁(yè)面結(jié)構(gòu)時(shí),災(zāi)難就愛上了你。

          sitemesh通過filter截取request和response,并給原始的頁(yè)面加入一定的裝飾(可能為header,footer...),然后把結(jié)果返回給客戶端,并且被裝飾的原始頁(yè)面并不知道sitemesh的裝飾,這也就達(dá)到了脫耦的目的。

          據(jù)說(shuō)即將新出臺(tái)的Portlet規(guī)范會(huì)幫助我們標(biāo)準(zhǔn)的實(shí)現(xiàn)比這些更多更c(diǎn)ool的想法,但可憐的我還不懂它到底是一個(gè)什末東東,有興趣的人可以研究
          jetspeed,或JSR (Java Specification Request) 168,但我想sitemesh如此簡(jiǎn)單,我們不妨先用著。

           

          讓我們看看怎樣配置環(huán)境
          除了要copy到WEB-INF/lib中的sitemesh.jar, copy到WEB-INF中的sitemesh-decorator.tld,sitemesh-page.tld文件外,還有2個(gè)文件要建立到WEB-INF/:
          • sitemesh.xml (可選)  
          • decorators.xml

          sitemesh.xml 可以設(shè)置2種信息:

          Page Parsers :負(fù)責(zé)讀取stream的數(shù)據(jù)到一個(gè)Page對(duì)象中以被SiteMesh解析和操作。(不太常用,默認(rèn)即可)

          Decorator Mappers : 不同的裝飾器種類,我發(fā)現(xiàn)2種比較有用都列在下面。一種通用的mapper,可以指定裝飾器的配置文件名,另一種可打印的裝飾器,可以允許你當(dāng)用http://localhost/aaa/a.html?printable=true方式訪問時(shí)給出原始頁(yè)面以供打印(免得把header,footer等的花哨的圖片也搭上)

          (但一般不用建立它,默認(rèn)設(shè)置足夠了:com/opensymphony/module/sitemesh/factory/sitemesh-default.xml):

          范例:

          <sitemesh>
               <page-parsers>
                 <parser default="true" class="com.opensymphony.module.sitemesh.parser.DefaultPageParser" />
                 <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
                 <parser content-type="text/html;charset=ISO-8859-1" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
               </page-parsers>

               <decorator-mappers>
                 <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
                   <param name="config" value="/WEB-INF/decorators.xml" />
                 </mapper>
                   <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
                      <param name="decorator" value="printable" />
                      <param name="parameter.name" value="printable" />
                              <param name="parameter.value" value="true" />
                   </mapper>
            
          </decorator-mappers>
          </sitemesh>

          decorators.xml :定義構(gòu)成復(fù)合視圖的所有頁(yè)面構(gòu)件的描述(主要結(jié)構(gòu)頁(yè)面,header,footer...),如下例:

          <decorators defaultdir="/_decorators">
               <decorator name="main" page="main.jsp">
                 <pattern>*</pattern>
               </decorator>
               <decorator name="printable" page="printable.jsp" role="customer" webapp="aaa" />
          </decorators>

          • defaultdir: 包含裝飾器頁(yè)面的目錄
          • page : 頁(yè)面文件名
          • name : 別名
          • role : 角色,用于安全
          • webapp : 可以另外指定此文件存放目錄
          • Patterns : 匹配的路徑,可以用*,那些被訪問的頁(yè)面需要被裝飾。

           

          最重要的是寫出裝飾器本身(也就是那些要復(fù)用頁(yè)面,和結(jié)構(gòu)頁(yè)面)。
          其實(shí),重要的工作就是制作裝飾器頁(yè)面本身(也就是包含結(jié)構(gòu)和規(guī)則的頁(yè)面),然后把他們描述到decorators.xml中。

          讓我們來(lái)先看一看最簡(jiǎn)單的用法:其實(shí)最常用也最簡(jiǎn)單的用法就是我們的hello例子,面對(duì)如此眾多的技術(shù),我想只要達(dá)到功能點(diǎn)到為止即可,沒必要去研究太深(除非您有更深的需求)。

          <%@ page contentType="text/html; charset=GBK"%><%@ taglib uri="sitemesh-decorator" prefix="decorator" %><html>     <head>       <title><decorator:title default="裝飾器頁(yè)面..." /></title>       <decorator:head />     </head>     <body>       sitemesh的例子<hr>       <decorator:body />       <hr>chen56@msn.com     </body></html>

          我們?cè)谘b飾器頁(yè)面只用了2個(gè)標(biāo)簽:

          <decorator:title default="裝飾器頁(yè)面..." />       : 把請(qǐng)求的原始頁(yè)面的title內(nèi)容插入到<title></title>中間。

          <decorator:body /> : 把請(qǐng)求的原始頁(yè)面的body內(nèi)的全部?jī)?nèi)容插入到相應(yīng)位置。

          然后我們?cè)赿ecorator.xml中加入以下描述即可:

          <decorator name="main" page="main.jsp">
                 <pattern>*</pattern>
          </decorator>

          這樣,請(qǐng)求的所有頁(yè)面都會(huì)被重新處理,并按照main.jsp的格式重新展現(xiàn)在你面前。

           

          讓我們看看更多的用法。(抄襲sitemesh文檔)
          以下列著全部標(biāo)簽:
          Decorator Tags Page Tags
          被用于建立裝飾器頁(yè)面. 被用于從原始內(nèi)容頁(yè)面訪問裝飾器.
          <decorator:head />
          <decorator:body />
          <decorator:title />
          <decorator:getProperty />
          <decorator:usePage />
          <page:applyDecorator />
          <page:param
           

          <decorator:head />

          插入原始頁(yè)面(被包裝頁(yè)面)的head標(biāo)簽中的內(nèi)容(不包括head標(biāo)簽本身)。

          <decorator:body />

          插入原始頁(yè)面(被包裝頁(yè)面)的body標(biāo)簽中的內(nèi)容。

          <decorator:title [ default="..." ] />

          插入原始頁(yè)面(被包裝頁(yè)面)的title標(biāo)簽中的內(nèi)容,還可以添加一個(gè)缺省值。

          例:

          /_decorator/main.jsp中 (裝飾器頁(yè)面): <title><decorator:title default="卻省title-hello"     /> - 附加標(biāo)題</title>

          /aaa.jsp中 (原始頁(yè)面):<title>aaa頁(yè)面</title>

          訪問/aaa.jsp的結(jié)果:<title>aaa頁(yè)面 - 附加標(biāo)題</title>

          <decorator:getProperty property="..." [ default="..." ] [ writeEntireProperty="..." ]/>

          在標(biāo)簽處插入原始頁(yè)面(被包裝頁(yè)面)的原有的標(biāo)簽的屬性中的內(nèi)容,還可以添加一個(gè)缺省值。

          sitemesh文檔中的例子很好理解:
          The decorator: <body bgcolor="white"<decorator:getProperty property="body.onload" writeEntireProperty="true" />>
          The undecorated page: <body onload="document.someform.somefield.focus();">
          The decorated page: <body bgcolor="white" onload="document.someform.somefield.focus();">

          注意,writeEntireProperty="true"會(huì)在插入內(nèi)容前加入一個(gè)空格。

          <decorator:usePage id="..." />
          象jsp頁(yè)面中的<jsp:useBean>標(biāo)簽一樣,可以使用被包裝為一個(gè)Page對(duì)象的頁(yè)面。 (懶的用)

          例:可用<decorator:usePage id="page" /><%=page.getTitle()%>達(dá)到<decorator:title/>的訪問結(jié)果。

           

          <page:applyDecorator name="..." [ page="..." title="..." ] >
          <page:param name="..."> ... </page:param>
          <page:param name="..."> ... </page:param>
          </page:applyDecorator>

          應(yīng)用包裝器到指定的頁(yè)面上,一般用于被包裝頁(yè)面中主動(dòng)應(yīng)用包裝器。這個(gè)標(biāo)簽有點(diǎn)不好理解,我們來(lái)看一個(gè)例子:

          包裝器頁(yè)面 /_decorators/panel.jsp:<p><decorator:title /></p>     ... <p><decorator:body /></p>
               并且在decorators.xml中有<decorator name="panel" page="panel.jsp"/>

          一個(gè)公共頁(yè)面,即將被panel包裝:/_public/date.jsp:  
               ... <%=new java.util.Date()%>     ...<decorator:getProperty property="myEmail" />

          被包裝頁(yè)面 /page.jsp :
               <title>page的應(yīng)用</title>
               .....  

               <page:applyDecorator name="panel" page="/_public/date.jsp" >
                 <page:param name="myEmail"> chen_p@neusoft.com </page:param>
               </page:applyDecorator>

          最后會(huì)是什末結(jié)果呢?除了/page.jsp會(huì)被默認(rèn)的包裝頁(yè)面包裝上header,footer外,page.jsp頁(yè)面中還內(nèi)嵌了date.jsp頁(yè)面,并且此date.jsp頁(yè)面還會(huì)被panel.jsp包裝為一個(gè)title加body的有2段的頁(yè)面,第1段是date.jsp的title,第2段是date.jsp的body內(nèi)容。

          另外,page:applyDecorator中包含的page:param標(biāo)簽所聲明的屬性值還可以在包裝頁(yè)面中用decorator:getProperty標(biāo)簽訪問到。


          可打印的界面裝飾
          前面說(shuō)過有1種可打印的裝飾器,可以允許你當(dāng)用http://localhost/aaa/a.html?printable=true方式訪問時(shí),應(yīng)用其他的裝飾器(自己指定),給出原始頁(yè)面以供打印(免得把header,footer等的花哨的圖片也搭上)。

          讓我們來(lái)看一看怎樣實(shí)現(xiàn)他:

          1.首先在WEB-INFO/sitemesh.xml中設(shè)置:
               <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
                 <param name="decorator" value="printable" />
                 <param name="parameter.name" value="printable" />
                 <param name="parameter.value" value="true" />
               </mapper>
          這樣就可以通過?printable=true來(lái)使用名為printable的裝飾器,而不是用原來(lái)的裝飾器。

          2.在WEB-INFO/decorators.xml中定義相應(yīng)的printable裝飾器
               <decorator name="printable" page="printable.jsp"/>

          3.最后編寫printable裝飾器/decorators/printable.jsp

          <%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
          <html>
          <head>
               <title><decorator:title /></title>
               <decorator:head />
          </head>
          <body>

               <h1><decorator:title /></h1>
               <p align="right"><i>(printable version)</i></p>

               <decorator:body />

          </body>
          </html>

          這樣就可以讓一個(gè)原始頁(yè)面通過?printable=true開關(guān)來(lái)切換不同的裝飾器頁(yè)面。

           

          中文問題
          由于sitemesh內(nèi)部所使用的缺省字符集為iso-8859-1,直接使用會(huì)產(chǎn)生亂碼,我們可以通過以下方法糾正之:
          • 方法1:可以在您所用的application server的配置文件中找一找,有沒有設(shè)置encoding或charset的項(xiàng)目,然后設(shè)成gbk或gb2312即可
          • 方法2:這也是我們一直使用的方法。
            1.在每一個(gè)jsp頁(yè)里設(shè)置: <%@ page contentType="text/html; charset=gbk"%> 來(lái)告訴server你所要求的字符集。
            2.在每個(gè)jsp頁(yè)的head中定義:<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=gbk"> 來(lái)告訴瀏覽器你所用的字符集。
          總結(jié):使用sitemesh最通常的途徑:

          1.配置好環(huán)境,

          2.在WEB-INFO/decroators.xml中描述你將建立的包裝器。

          3.開發(fā)在decroators.xml中描述的包裝器,最好存放在/_decorators目錄下

          4.ok ,可以看看辛勤的成果了 :

           

           

          sitemesh,一個(gè)不錯(cuò)的tiles替代方案,比tiles做的更漂亮優(yōu)雅。本文是sitemesh官方推薦的入門文檔,本來(lái)想自己翻譯的,突然發(fā)現(xiàn)有人先行一步了,就轉(zhuǎn)過來(lái)看吧。

          以前我通常使用舊式的方法來(lái)建立自己的web應(yīng)用:手工排版,仔細(xì)使用每一個(gè)字節(jié)使其工作在Unicode下,同時(shí)使用make文件來(lái)適應(yīng)不同的CPU……
          或許現(xiàn)在我們可以換一種方式。
          盡管我從沒有感覺到需要使用assembly (CISC or RISC)來(lái)建立web應(yīng)用,但也會(huì)偶爾覺得我的開發(fā)伙伴的工作相當(dāng)繁瑣。特別是我發(fā)現(xiàn)很多的開發(fā)者在痛苦的尋求一種比較好的方式來(lái)控制web應(yīng)用的基本模塊:例如那些頁(yè)頭、頁(yè)尾、導(dǎo)航欄、打印頁(yè)面、手持設(shè)備的輕量級(jí)頁(yè)面,以及其他更多的問題。到了最后,令人驚異的是大部分人都采用了落后的includes和復(fù)制粘貼方式。
          根據(jù)經(jīng)驗(yàn),我可以采用在java.net開源的servlet 過濾器SiteMeshn來(lái)簡(jiǎn)單明了并優(yōu)雅的解決這些問題。作為一種替代新的templating語(yǔ)言(XSLT)或部署您的頁(yè)面到新的系統(tǒng)的解決方法,應(yīng)用SiteMesh可以相當(dāng)容易處理你的頁(yè)面,這一切只需要普通的HTML,JSP,servlet(包括Struts),以及其他常用的技術(shù)。
          工作原理SiteMesh利用了一種很少人知道的servlet規(guī)范實(shí)現(xiàn)了一種頁(yè)面過濾器。設(shè)想一下,現(xiàn)在有一個(gè)簡(jiǎn)單的jsp頁(yè)面用來(lái)返回當(dāng)前的日期和時(shí)間。通常這個(gè)頁(yè)面請(qǐng)求來(lái)到應(yīng)用服務(wù)器,頁(yè)面被處理,最后處理結(jié)果返回到web瀏覽器。SiteMesh作為一個(gè)頁(yè)面過濾器,在頁(yè)面被處理之后,返回web瀏覽器之前,對(duì)頁(yè)面做了一些附加的操作。這個(gè)變化簡(jiǎn)單描述為圖一和圖二所示的附加步驟。

          圖一:普通頁(yè)面處理情況

          圖二:SiteMesh對(duì)頁(yè)面處理情況
          現(xiàn)在看一個(gè)簡(jiǎn)單的例子。
          <html>
          <head>
          <title>Simple Document</title>
          </head>
          <body>
          Hello World! <br />
          <%= 1+1 %>
          </body>
          </html>你會(huì)發(fā)現(xiàn)這個(gè)頁(yè)面有一個(gè)title和body(類似普通的HTML頁(yè)面)。你也會(huì)發(fā)現(xiàn)一小段JSP代碼——它將會(huì)如同你期望的那樣被處理。同時(shí)你可以使用任何你想使用的JSP語(yǔ)法和特性來(lái)替換這一小段代碼。
          現(xiàn)在來(lái)看一個(gè)簡(jiǎn)單的SiteMesh "裝飾(decorator)"頁(yè)面。列表2顯示了一個(gè)被SiteMesh調(diào)用的JSP頁(yè)面。
          <%@ taglib uri="sitemesh-decorator"
          prefix="decorator" %>
          <html>
          <head>
          <title>
          My Site - <decorator:title default="Welcome!" />
          </title>
          <decorator:head />
          </head>
          <body>
          <h1><decorator:title default="Welcome!" /></h1>
          <p><decorator:body /></p>
          <p><small>
          (<a
          href="?printable=true">printable version</a>
          </small></p>
          </body>
          </html>查看這個(gè)裝飾器(decorator),我們能看到一些有趣的東西。首先,在第一行申明了一個(gè)SiteMesh標(biāo)簽庫(kù)。這個(gè)標(biāo)簽庫(kù)包含了與原始頁(yè)面一起工作時(shí)所需的所有東西。你能看到我們使用了兩個(gè)SiteMesh的裝飾標(biāo)簽(declared tags),<decorator:title><decorator:body>。不要驚訝于標(biāo)簽<decorator:title>在原始頁(yè)面中顯示<title>標(biāo)簽中的內(nèi)容,<decorator:body>中的內(nèi)容也是如此。我們?cè)谶@個(gè)頁(yè)面的HEAD和BODY元素都使用了同一個(gè)title標(biāo)簽。(We're making a few fairly radical changes to the page, including repeating the title both in theHEADelement as well as theBODY. )同時(shí),我們還增加了一個(gè)到可打印版本頁(yè)面的鏈接。
          作為對(duì)照,圖三顯示了原始處理頁(yè)面,圖四顯示了被修飾過的處理頁(yè)面。留意被裝飾頁(yè)面在瀏覽器窗口顯示的標(biāo)題文字和HTML內(nèi)容。同時(shí)也可以看到增加了一個(gè)可打印頁(yè)面的鏈接——這個(gè)我們回頭再說(shuō)。

          圖三:原始未修飾頁(yè)面

          圖四:被修飾頁(yè)面
          很明顯,對(duì)比起使用include(例如<jsp:include page="foo.jsp" flush="true" />)來(lái)說(shuō),以這樣的方式使用頁(yè)頭、頁(yè)尾系統(tǒng)結(jié)構(gòu)要清晰得多。這種方式更易移植、更易理解,同時(shí)也鼓勵(lì)了JSP頁(yè)面不再使用導(dǎo)航或其他類似的表現(xiàn)層代碼。我發(fā)現(xiàn)在JSP頁(yè)面中使用裝飾器和CSS的組合比標(biāo)準(zhǔn)HTML的標(biāo)簽更容易去除格式信息。
          安裝SiteMesh注意下面的屏幕截圖是基于Windows XP Professional,Tomcat 5.0.19,和Java 2 SDK 1.4.2_03的環(huán)境之上的。在這里我假定你的Tomcat已經(jīng)安裝完畢并且可以正常工作了。你或許會(huì)有一些混淆,但我們已經(jīng)成功地在Tomcat 4.1 和 WebLogic 測(cè)試過,同時(shí) SiteMesh 也支持大部分的web應(yīng)用服務(wù)器。
          本文描述的SiteMesh 2.0.1可以在下載到。 在java.net 上SiteMesh's 的項(xiàng)目庫(kù)中有四個(gè)文件可以下載。sitemesh-2.0.1.jar是其核心 JAR 文件,sitemesh-2.0.1-sources.zip的作用正如同其名字所述,sitemesh-example.war則提供了一個(gè)復(fù)雜的例子用來(lái)顯示一些SiteMesh的高級(jí)特性。
          為了使描述更加簡(jiǎn)單,我們從sitemesh-blank.war文件開始。將該WAR文件放入Tomcat 的webapps目錄,WAR包將自動(dòng)解壓顯示內(nèi)容(SoSo注:這里的前提是你的tomcat已經(jīng)開始工作),如圖五所示。

          圖五: SiteMesh_blank.WAR解開后的內(nèi)容
          我們花點(diǎn)時(shí)間描述一下這些文件的作用。
          web.xml首先,WEB-INF/web.xml文件顯示如列表3,這些語(yǔ)句用來(lái)安裝SiteMesh 過濾器和標(biāo)簽庫(kù)。如果你決定在一個(gè)已有的Web應(yīng)用中使用SiteMesh,你必須把這些語(yǔ)句添加到你的WEB-INF/web.xml文件中。
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          <!-- Start of SiteMesh stuff -->
          <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>*.jsp</url-pattern>
          </filter-mapping>
          <taglib>
          <taglib-uri>sitemesh-page</taglib-uri>
          <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location>
          </taglib>
          <taglib>
          <taglib-uri>sitemesh-decorator</taglib-uri>
          <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location>
          </taglib>
          <!-- End of SiteMesh stuff -->
          </web-app>注意:這里需要注意一下url-pattern的寫法-- 如果使用的是Tomcat 5(而不是 Tomcat 4 ),需要將默認(rèn)的*修改如*.jsp的形式。最新的servlet規(guī)范不再支持*樣式。
          decorators.xmlWEB-INF/decorators.xml文件用來(lái)將一個(gè)裝飾器名字同一個(gè)專門的JSP裝飾文件綁定。作為一個(gè)例子,這里將JSP裝飾文件minimal.jsp同一個(gè)稱為handheld的裝飾器綁定起來(lái)。
          <decorators defaultdir="/decorators">
          <decorator name="main" page="main.jsp">
          <pattern>*</pattern>
          </decorator>

          <decorator name="panel" page="panel.jsp"/>
          <decorator name="printable" page="printable.jsp"/>
          </decorators>正如我們?cè)诖a列表里看到的一樣,我們定義了三個(gè)裝飾器,他們分別綁定了三個(gè)類似的JSP頁(yè)面。我們可以看到一個(gè)默認(rèn)裝飾器(main.jsp),它將被默認(rèn)運(yùn)用于所有文件。
          缺省的,SiteMesh使用下面的邏輯來(lái)選擇使用哪一個(gè)裝飾器:
          這個(gè)邏輯在sitemesh-2.0.1.jar包的\com\opensymphony\module\sitemesh\factor\sitemesh-default.xml文件里被描述。你可以針對(duì)諸如:客戶端操作系統(tǒng),web瀏覽器,用戶代理等在WEB-INF\sitemesh.xml文件里,通過一個(gè)變量覆蓋這個(gè)行為。(You can override this behavior. with a wide variety ofbuilt-in mappersfor things like language, client operating system, web browser/user agent, etc. by creating aWEB-INF\sitemesh.xmlfile. )可以在sitemesh-example.war找到例子。

          1. 頁(yè)面是否使用meta裝飾器標(biāo)簽(meta. decorator tag)特別指定了一個(gè)裝飾器?
          2. 頁(yè)面是否是一個(gè)框架集(是的話則不應(yīng)用裝飾器)?
          3. 頁(yè)面是否使用了printable=true參數(shù)(是的話則使用打印裝飾器)
          4. 頁(yè)面時(shí)候使用裝飾器文件名特別指定了一個(gè)裝飾器?
          5. 頁(yè)面是否匹配decorators.xml文件里描述的樣式?
               

          通常第一條規(guī)則僅用來(lái)確定該裝飾器是否被使用(Conceptually, the first rule that evaluates to true determines the decorator that is used. )在上面的例子中,當(dāng)出現(xiàn)printable=true參數(shù)的時(shí)候,裝飾器printable.jsp(規(guī)則 #3)替代了main.jsp(規(guī)則 #5)。在SiteMesh中,這些規(guī)則被描述為mappers。
          decorators/*.jsp這三個(gè)decorators目錄下的文件是decorators.xml文件中描述的不同裝飾器JSP文件。上面是一個(gè)簡(jiǎn)單的裝飾器例子,在后面我們將討論更復(fù)雜的示例。
          sitemesh-2.0.1.jar這是SiteMesh最主要的二進(jìn)制文件,通常被安裝在WEB-INF/lib目錄下。可以在www.opensymphony.com/sitemesh/api找到這個(gè)庫(kù)的javadoc。
          *.tldSiteMesh使用兩個(gè)標(biāo)簽庫(kù),但大多數(shù)人都只需要sitemesh-decorator.tld。你可以在www.opensymphony.com/sitemesh/tags.html找到相應(yīng)的文檔。我們已經(jīng)講述了最主要的標(biāo)簽:head,title和body。在下一章我們來(lái)討論剩下的標(biāo)簽:getProperty。
          SiteMesh高級(jí)特性SiteMesh的一個(gè)重要特性是使用原始HTML的meta標(biāo)簽(例如<meta. name="foo" c>)從基礎(chǔ)頁(yè)面?zhèn)鬟f信息到裝飾器。作為一個(gè)例子,下面我們使用一個(gè)meta標(biāo)簽來(lái)定義HTML頁(yè)面的作者。
          <html>
          <meta. name="author" c>
          <head>
          <title>Simple Document</title>
          </head>
          <body>
          Hello World! <br />
          <%= 1+1 %>
          </body>
          </html>我們定義一個(gè)“smart”裝飾器來(lái)研究meta標(biāo)簽,如果出現(xiàn)這個(gè)標(biāo)簽,則可以得到一個(gè)相應(yīng)的HTML:
          <%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
          <decorator:usePage id="myPage" />
          <html>
          <head>
          <title>My Site -
          <decorator:title default="Welcome!" />
          </title>
          <decorator:head />
          </head>

          <body>
          <h1><decorator:title default="Welcome!" /></h1>
          <h3>
          <a href="mailto:<decorator:getProperty property="meta.author"
          default="staff@example.com" />">
          <decorator:getProperty property="meta.author"
          default="staff@example.com" />
          </a></h3><hr />
          <decorator:body />
          <p><small>
          (<a href="?printable=true">printable version</a>
          </small>
          </p>
          </body>
          </html>可以看到我們使用了getProperty標(biāo)簽的一個(gè)默認(rèn)屬性——如果沒有指定author,我們就設(shè)定其為staff。如果你決定使用這個(gè)模型儲(chǔ)存頁(yè)面的meta數(shù)據(jù),你或許需要和你的開發(fā)伙伴一起來(lái)確定將使用什么標(biāo)簽以及如何使用他們。簡(jiǎn)單的,你或許想要使用meta標(biāo)簽來(lái)描述諸如頁(yè)面作者及時(shí)間戳之類的東西。更復(fù)雜一些,你或許會(huì)想像XML文件一樣標(biāo)準(zhǔn)化的管理你的站點(diǎn)導(dǎo)航,同時(shí)使用meta標(biāo)簽來(lái)通過頁(yè)面節(jié)點(diǎn)轉(zhuǎn)到裝飾器。(At the complex end, you may do things like standardize on an XML file to manage your site navigation and use ametatag to pass the page's node to the decorator. )
          圖六顯示了應(yīng)用上面的裝飾器JSP頁(yè)面之后生成的結(jié)果。

          圖六:meta標(biāo)簽顯示
          這些頁(yè)面屬性非常強(qiáng)大,并且擁有著很多不同的特性,并不僅止于meta標(biāo)簽(常用頁(yè)面特性列表)。使用SiteMesh一段時(shí)間之后,你就會(huì)開始思考HTML和JSP作為一種簡(jiǎn)單標(biāo)記語(yǔ)言的機(jī)制——接近最原始的HTML——無(wú)需操作就可以完整的切換到XML/XSL 或其他模版引擎。
          小結(jié)綜上所述,SiteMesh 提供了一個(gè)強(qiáng)大、易用、易結(jié)合的機(jī)制來(lái)使用頁(yè)面模版。可以想象,它將會(huì)有很廣泛的用戶群。例如,你可以定義一個(gè)裝飾器針對(duì)不同的瀏覽器輸出額外的頁(yè)面調(diào)試信息(和特定web瀏覽器結(jié)合之后將產(chǎn)生一個(gè)特別的功能,你可以強(qiáng)制指定使用某一種用戶代理)。你也可以定義一個(gè)裝飾器產(chǎn)生stripped-down XML輸出,用來(lái)進(jìn)行簡(jiǎn)單的自動(dòng)化測(cè)試。你甚至可以使用裝飾器從其他頁(yè)面提取內(nèi)容,例如輸出到一些簡(jiǎn)單的門戶容器。
          sitemesh-blank.war入手比較容易,但我建議學(xué)習(xí)sitemesh-example.war以獲取更多的特性和思想。
          不論你如何使用SiteMesh,我都發(fā)現(xiàn)它將大量的代碼從表現(xiàn)層中移到我的裝飾器中,而無(wú)需學(xué)習(xí)一種新的編程語(yǔ)言或是模版系統(tǒng)。
          對(duì)了,作為最后的補(bǔ)充,如果你仍然對(duì)組合建立web頁(yè)面感興趣,可以查看home.worldonline.dk/viksoe/asmil.htm
          文章引用自:http://blog.51766.com/comments/zy/Weblog/1143682180134
           

          posted on 2007-12-02 09:44 禮物 閱讀(1640) 評(píng)論(0)  編輯  收藏 所屬分類: struts2.0
          主站蜘蛛池模板: 县级市| 井冈山市| 突泉县| 恭城| 开阳县| 友谊县| 陵水| 石城县| 乐平市| 来凤县| 仙游县| 孟津县| 贵定县| 河东区| 巨野县| 余干县| 昌乐县| 铁力市| 广西| 连山| 天全县| 海阳市| 乌审旗| 广灵县| 华阴市| 汕头市| 磐石市| 通化县| 织金县| 高要市| 花莲县| 锡林郭勒盟| 宜良县| 开封市| 关岭| 临汾市| 恩平市| 小金县| 黔南| 左权县| 荆门市|