seasun  
          在不斷模仿、思考、總結(jié)中一步一步進(jìn)步!
          公告
          •     我的blog中的部分資源是來自于網(wǎng)絡(luò)上,如果您認(rèn)為侵犯了您的權(quán)利,請及時(shí)聯(lián)系我,我會盡快刪除!E-MAIL:shiwenfeng@aliyun.com和QQ:281340916,歡迎交流。

          日歷
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          常用鏈接

          隨筆分類

          good blog author

          積分與排名

          • 積分 - 81738
          • 排名 - 700

          最新評論

          閱讀排行榜

           

          一、SiteMesh項(xiàng)目簡介 (http://www.opensymphony.com/sitemesh/
                OS(OpenSymphony)的SiteMesh是一個(gè)用來在JSP中實(shí)現(xiàn)頁面布局和裝飾(layout and decoration)的框架組件,能夠幫助網(wǎng)站開發(fā)人員較容易實(shí)現(xiàn)頁面中動態(tài)內(nèi)容和靜態(tài)裝飾外觀的分離。

                 Sitemesh是由一個(gè)基于Web頁面布局、裝飾以及與現(xiàn)存Web應(yīng)用整合的框架。它能幫助我們在由大
          量頁面構(gòu)成的項(xiàng)目中創(chuàng)建一致的頁面布局和外觀,如一致的導(dǎo)航條,一致的banner,一致的版權(quán),等等。
          它不僅僅能處理動態(tài)的內(nèi)容,如jsp,php,asp等產(chǎn)生的內(nèi)容,它也能處理靜態(tài)的內(nèi)容,如htm的內(nèi)容,
          使得它的內(nèi)容也符合你的頁面結(jié)構(gòu)的要求。甚至于它能將HTML文件象include那樣將該文件作為一個(gè)面板
          的形式嵌入到別的文件中去。所有的這些,都是GOF的Decorator模式的最生動的實(shí)現(xiàn)。盡管它是由java語言來實(shí)現(xiàn)的,但它能與其他Web應(yīng)用很好地集成。 
                官方:
          http://www.opensymphony.com/sitemesh/ 
                下載地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;

          二、為什么要使用SiteMesh? 
              我們的團(tuán)隊(duì)開發(fā)J2EE應(yīng)用的時(shí)候,經(jīng)常會碰到一個(gè)比較頭疼的問題:由于Web頁面是由不同的人所開發(fā),所以開發(fā)出來的界面通常是千奇百怪,通常讓項(xiàng)目管理人員苦笑不得。而實(shí)際上,任何一個(gè)項(xiàng)目都會要求界面的統(tǒng)一風(fēng)格和美觀,既然風(fēng)格統(tǒng)一,那就說明UI層肯定有很多可以抽出來共用的靜態(tài)或動態(tài)部分;如何整合這些通用的靜態(tài)或動態(tài)UI呢?Apache Tiles框架站了出來很好的解決了這一問題,再加上他與struts的完美集成,導(dǎo)致大小項(xiàng)目都把他作為UI層的首選框架,但是:Tiles確實(shí)有著它很多的不足之處,下文我會介紹,本文想說的是,除了Apache Tiles框架,其實(shí)我們還有更好的解 決方案,那就是:SiteMesh;
              本文介紹了一個(gè)基于Web頁面的布局、裝飾以及應(yīng)用整合的框架Sitemesh,它能幫助你為你的應(yīng)用創(chuàng)建一致的外觀,很好的取代Apache Tiles;

          三、SiteMesh VS Apache Tiles 
               用過struts的朋友應(yīng)該對Apache Tiles的不會陌生,我曾經(jīng)有一篇文章介紹過struts中tiles框架的組合與繼承,現(xiàn)在怎么看怎么覺得復(fù)雜
                 從使用角度來看,Tiles似乎是Sitemesh標(biāo)簽<page:applyDecorator>的一個(gè)翻版。其實(shí)sitemesh最強(qiáng)的一個(gè)特性是sitemesh將decorator模式用在過濾器上。任何需要被裝飾的頁面都不知道它要被誰裝飾,所以它就可以用來裝璜來自php、asp、CGI等產(chǎn)生的頁面了。你可以定義若干個(gè)裝飾器,根據(jù)參數(shù)動態(tài)地選擇裝飾器,產(chǎn)生動態(tài)的外觀以滿足你的需求。它也有一套功能強(qiáng)大的屬性體系,它能幫助你構(gòu)建功能強(qiáng)大而靈活的裝飾器。相比較而言,在這方面Tiles就遜色許多。 
               個(gè)人覺得在團(tuán)隊(duì)開發(fā)里面,Apache Tiles框架會導(dǎo)致所有人不僅僅要了解并且清楚Apache Tiles的存在,并且要特別熟悉每一個(gè)Tiles layout模板的作用,否則就可能出現(xiàn)用錯模板的情況;除此之外,每個(gè)人涉及到的所有WEB頁面都需要去配置文件里面逐個(gè)配置,不僅麻煩出錯的幾率還高;而以上所有的不足都是SiteMesh所不存在的。

          四、SiteMesh的基本原理 
                一個(gè)請求到服務(wù)器后,如果該請求需要sitemesh裝飾,服務(wù)器先解釋被請求的資源,然后根據(jù)配置文件
          獲得用于該請求的裝飾器,最后用裝飾器裝飾被請求資源,將結(jié)果一同返回給客戶端瀏覽器。

          五、如何使用SiteMesh 
                 這里以struts2+spring2+hibernate3構(gòu)架的系統(tǒng)為例 
                    1、下載SiteMesh 
                        下載地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;       
                     2、在工程中引入SiteMesh的必要jar包,和struts2-sitemesh-plugin-2.0.8.jar;       
                     3、修改你的web.xml,在里面加入sitemesh的過濾器,示例代碼如下:
                  
          <!-- sitemesh配置 -->
              <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> 
                   注意過濾器的位置:應(yīng)該在struts2的org.apache.struts2.dispatcher.FilterDispatcher過濾器之前org.apache.struts2.dispatcher.ActionContextCleanUp過濾器之后,否則會有問題;

                 4、在下載的SiteMesh包中找到sitemesh.xml,(\sitemesh-2.3\src\example-webapp\WEB-INF目錄下就有)
                  將其拷貝到/WEB-INF目錄下;

                 5、在sitemesh.xml文件中有一個(gè)property結(jié)點(diǎn)(如下),該結(jié)點(diǎn)指定了decorators.xml在工程中的位置,讓sitemesh.xml能找到他; 按照此路徑新建decorators.xml文件,當(dāng)然這個(gè)路徑你可以任意改變,只要property結(jié)點(diǎn)的value值與其匹配就行; 
              <property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/> 
              
                6、在WebRoot目錄下新建decorators目錄,并在該目錄下新建一個(gè)模板jsp,根據(jù)具體項(xiàng)目風(fēng)格編輯該模板,
                      如下示例:我的模板:main.jsp

          <%@ page language="java" pageEncoding="UTF-8"%>
          <%@taglib prefix="decorator"
               uri="http://www.opensymphony.com/sitemesh/decorator"%>
          <%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <%
               response.setHeader("Pragma", "no-cache");
               response.setHeader("Cache-Control", "no-cache");
               response.setDateHeader("Expires", 0);
          %>
          <html>
              <head>
                  <title><decorator:title default="kangxm test" />
                  </title>
                  <!-- 頁面Head由引用模板的子頁面來替換 -->
                  <decorator:head />
              </head>
              <body id="page-home">
                  <div id="page-total">
                      <div id="page-header">
                          <table width="100%" border="0" cellspacing="0" cellpadding="0">
                              <tr>
                                  <td>
                                      <div class="topFunc">
                                           我的賬戶
                                           |
                                           退出
                                      </div>
                                  </td>
                              </tr>
                          </table>
                      </div>
                  </div>
                  <!-- end header -->
                  <!--   Menu Tag begin -->
                  <div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;">
                      <div>
                           這里放菜單
                      </div>
                  </div>
                  <!--   Menu Tag end -->
                  <div id="page-content" class="clearfix">
                      <center>
                          <table width="100%" border="0" cellpadding="0" cellspacing="0">
                              <tr>
                                  <td>
                                      <decorator:body /><!-- 這里的內(nèi)容由引用模板的子頁面來替換 -->
                                  </td>
                              </tr>
                          </table>
                      </center>
                  </div>
                  <!-- end content -->
                  <div id="page-footer" class="clearfix">

                       這里放頁面底部
                      <!-- end footer -->
                  </div>
                  <!-- end page -->
              </body>
          </html>


          這就是個(gè)簡單的模板,頁面的頭和腳都由模板里的靜態(tài)HTML決定了,主頁面區(qū)域用的是<decorator:body />標(biāo)簽;也就是說凡是能進(jìn)入過濾器的請求生成的頁面都會默認(rèn)加上模板上的頭和腳,然后頁面自身的內(nèi)容將自動放到<decorator:body />標(biāo)簽所在位置;
          <decorator:title default="Welcome to test sitemesh!" />:讀取被裝飾頁面的標(biāo)題,并給出了默認(rèn)標(biāo)題。
          <decorator:head />:讀取被裝飾頁面的<head>中的內(nèi)容;
          <decorator:body />:讀取被裝飾頁面的<body>中的內(nèi)容;

                7、說到這里大家就要想了,那如果某個(gè)特殊的需求請求路徑在過濾器的范圍內(nèi),但又不想使用模板怎么辦? 你總不能這么不講道理吧!大家放心吧,SiteMesh早就考慮到這一點(diǎn)了,上面第5步說道的decorators.xml這個(gè)時(shí)候就起到作用了!
                 
          下面是我的decorators.xml:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <decorators defaultdir="/decorators">
              <!-- Any urls that are excluded will never be decorated by Sitemesh -->
              <excludes>
                  <pattern>/index.jsp*</pattern>
                    <pattern>/login/*</pattern>
              </excludes>
              <decorator name="main" page="main.jsp">
                  <pattern>/*</pattern>
              </decorator>
          </decorators>

          decorators.xml有兩個(gè)主要的結(jié)點(diǎn):
                 decorator結(jié)點(diǎn)指定了模板的位置和文件名,通過pattern來指定哪些路徑引用哪個(gè)模板
                 excludes結(jié)點(diǎn)則指定了哪些路徑的請求不使用任何模板
          如上面代碼,/index.jsp和凡是以/login/開頭的請求路徑一律不使用模板;
          另外還有一點(diǎn)要注意的是:decorators結(jié)點(diǎn)的defaultdir屬性指定了模板文件存放的目錄;

          六、實(shí)戰(zhàn)感受 
                剛剛做完一個(gè)用到sitemesh的項(xiàng)目,跟以前用tiles框架相比,最大的感受就是簡單,系統(tǒng)設(shè)計(jì)階段
          就把模板文件和sitemesh框架搭好了!哪些頁面使用框架哪些不使用,全部都通過UI Demo很快就定義出來了;
          在接下來的開發(fā)中所有成員幾乎感受不到sitemesh的存在,各自僅僅關(guān)心自己的模塊功能實(shí)現(xiàn);

          七、總結(jié) 
              使用sitemesh給我們帶來的是不僅僅是頁面結(jié)構(gòu)問題,它的出現(xiàn)讓我們有更多的時(shí)間去關(guān)注底層業(yè)務(wù)
          邏輯,而不是整個(gè)頁面的風(fēng)格和結(jié)構(gòu)。它讓我們擺脫了大量用include方式復(fù)用頁面尷尬局面,也避免了tiles
          框架在團(tuán)隊(duì)開發(fā)中的復(fù)雜度,它還提供了很大的靈活性以及給我們提供了整合異構(gòu)Web系統(tǒng)頁面的一種方案


          本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/it_man/archive/2009/01/17/3817347.aspx

          posted on 2009-10-27 15:47 shiwf 閱讀(1321) 評論(0)  編輯  收藏 所屬分類: 1.08 sitemesh

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © shiwf Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 丹寨县| 资阳市| 聂拉木县| 蕲春县| 饶平县| 娄烦县| 邵阳市| 泾阳县| 广元市| 敖汉旗| 宁波市| 龙江县| 桂平市| 柳州市| 花莲县| 张家川| 惠州市| 商河县| 荆门市| 昌邑市| 绥中县| 灵丘县| 景泰县| 盈江县| 凤山县| 洪洞县| 屯留县| 鹤山市| 衡水市| 蒙山县| 新竹市| 乐陵市| 乌兰察布市| 沁源县| 广水市| 南宁市| 班戈县| 大港区| 汽车| 江西省| 烟台市|