<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 37  文章 - 14  trackbacks - 0
    <2007年6月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    相關鏈接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    以前我通常使用舊式的方法來建立自己的web應用:手工排版,仔細使用每一個字節使其工作在Unicode下,同時使用make文件來適應不同的CPU……

    或許現在我們可以換一種方式。

    盡管我從沒有感覺到需要使用assembly (CISC or RISC)來建立web應用,但也會偶爾覺得我的開發伙伴的工作相當繁瑣。特別是我發現很多的開發者在痛苦的尋求一種比較好的方式來控制web應用的基本模塊:例如那些

    1 頁頭
    2 頁尾
    3 導航欄
    4 打印頁面
    5 手持設備的輕量級頁面

    以及其他更多的問題。到了最后,令人驚異的是大部分人都采用了落后的includes和復制粘貼方式。

    根據經驗,我可以采用在 java.net 上開源的servlet 過濾器 SiteMeshn來簡單明了并優雅的解決這些問題。作為一種替代新的templating語言(XSLT)或部署您的頁面到新的系統的解決方法,應用SiteMesh可以相當容易處理你的頁面,這一切只需要普通的HTML,JSP,servlet(包括Struts),以及其他常用的技術。

    一 :工作原理

    SiteMesh利用了一種很少人知道的servlet規范實現了一種頁面過濾器。設想一下,現在有一個簡單的jsp頁面用來返回當前的日期和時間。通常這個頁面請求來到應用服務器,頁面被處理,最后處理結果返回到web瀏覽器。SiteMesh作為一個頁面過濾器,在頁面被處理之后,返回web瀏覽器之前,對頁面做了一些附加的操作。這個變化簡單描述為圖一和圖二所示的附加步驟。





    圖二:SiteMesh對頁面處理情況

    現在看一個簡單的例子。

    < html >
        
    < head >
            
    < title > Simple Document </ title >
        
    </ head >

        
    < body >
            Hello World
    !   < br  />
            
    <%=   1 + 1   %>
        
    </ body >
    </ html >  

    你會發現這個頁面有一個title和body(類似普通的HTML頁面)。你也會發現一小段JSP代碼——它將會如同你期望的那樣被處理。同時你可以使用任何你想使用的JSP語法和特性來替換這一小段代碼。

    現在來看一個簡單的SiteMesh "裝飾(decorator)"頁面。列表2顯示了一個被SiteMesh調用的JSP頁面。

    <% @ 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 >  

    查看這個裝飾器(decorator),我們能看到一些有趣的東西。首先,在第一行申明了一個SiteMesh標簽庫。這個標簽庫包含了與原始頁面一起工作時所需的所有東西。你能看到我們使用了兩個SiteMesh的裝飾標簽(declared tags),

    1 < decorator:title >  
    2 < decorator:body >

     不要驚訝于標簽<decorator:title>在原始頁面中顯示<title>標簽中的內容, <decorator:body> 中的內容也是如此。我們在這個頁面的HEAD和BODY元素都使用了同一個title標簽,同時,我們還增加了一個到可打印版本頁面的鏈接。

    作為對照,圖三顯示了原始處理頁面,圖四顯示了被修飾過的處理頁面。留意被裝飾頁面在瀏覽器窗口顯示的標題文字和HTML內容。同時也可以看到增加了一個可打印頁面的鏈接——這個我們回頭再說。


    圖三:原始未修飾頁面



    圖四:被修飾頁面

    很明顯,對比起使用include

    例如 < jsp:include page = " foo.jsp "  flush = " true "   />

    來說,以這樣的方式使用頁頭、頁尾系統結構要清晰得多。這種方式更易移植、更易理解,同時也鼓勵了JSP頁面不再使用導航或其他類似的表現層代碼。我發現在JSP頁面中使用裝飾器和CSS的組合比標準HTML的標簽更容易去除格式信息。

    二 : 安裝SiteMesh

    注意下面的屏幕截圖是基于Windows XP Professional, Tomcat 5.0.19,和Java 2 SDK 1.4.2_03的環境之上的。在這里我假定你的Tomcat已經安裝完畢并且可以正常工作了。你或許會有一些混淆,但我們已經成功地在Tomcat 4.1 和 WebLogic 測試過,同時 SiteMesh 也支持大部分的web應用服務器。

    本文描述的SiteMesh 2.0.1可以在 下載到。 在java.net 上SiteMesh's 的項目庫中有四個文件可以下載。sitemesh-2.0.1.jar 是其核心 JAR 文件, sitemesh-2.0.1-sources.zip 的作用正如同其名字所述, sitemesh-example.war 則提供了一個復雜的例子用來顯示一些SiteMesh的高級特性。

    為了使描述更加簡單,我們從sitemesh-blank.war 文件開始。將該WAR文件放入Tomcat 的webapps 目錄,WAR包將自動解壓顯示內容(SoSo注:這里的前提是你的tomcat已經開始工作),如圖五所示。



    圖五: SiteMesh_blank.WAR解開后的內容

    我們花點時間描述一下這些文件的作用。

    1  :  web.xml

    首先,WEB-INF/web.xml 文件顯示如列表3,這些語句用來安裝SiteMesh 過濾器和標簽庫。如果你決定在一個已有的Web應用中使用SiteMesh,你必須把這些語句添加到你的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 >  
        
    < 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 >  
    </ web - app >  

    注意:這里需要注意一下url-pattern的寫法-- 如果使用的是Tomcat 5(而不是 Tomcat 4 ),需要將默認的*修改如*.jsp的形式。最新的servlet規范不再支持*樣式。

    2 : decorators.xml

    WEB-INF/decorators.xml 文件用來將一個裝飾器名字同一個專門的JSP裝飾文件綁定

    < 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 >  

    正如我們在代碼列表里看到的一樣,我們定義了三個裝飾器,他們分別綁定了三個類似的JSP頁面。我們可以看到一個默認裝飾器(main.jsp),它將被默認運用于所有文件。

    2.1  :   缺省的,SiteMesh使用下面的邏輯來選擇使用哪一個裝飾器:

     

    這個邏輯在sitemesh-2.0.1.jar 包的 \com\opensymphony\module\sitemesh\factor\sitemesh-default.xml 文件里被描述。

    sitemesh-default.xml  :

    < sitemesh >
        
    < property name = " decorators-file "  value = " /WEB-INF/decorators.xml " />
        
    < excludes file = " ${decorators-file} " />

        
    < page - parsers >
            
    < parser content - type = " text/html "   class = " com.opensymphony.module.sitemesh.parser.FastPageParser "   />
        
    </ page - parsers >
        
    < decorator - mappers >

                //頁面是否使用meta裝飾器標簽(meta decorator tag)特別指定了一個裝飾器?
            
    < mapper  class = " com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper " >
                
    < param name = " property.1 "  value = " meta.decorator "   />
                
    < param name = " property.2 "  value = " decorator "   />
            
    </ mapper >

                //頁面是否是一個框架集(是的話則不應用裝飾器)?
            
    < mapper  class = " com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper " />

                //頁面是否使用了printable=true 參數(是的話則使用打印裝飾器)
            
    < 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 >

                //頁面時候使用裝飾器文件名特別指定了一個裝飾器
            
    < mapper  class = " com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper " />

                //頁面是否匹配 decorators.xml 文件里描述的樣式?
            
    < mapper  class = " com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper " >
                
    < param name = " config "  value = " ${decorators-file} "   />
            
    </ mapper >

        
    </ decorator - mappers >
    </ sitemesh >


    你可以針對諸如:客戶端操作系統,web瀏覽器,用戶代理等在WEB-INF\sitemesh.xml文件里,通過一個變量覆蓋這個行為, 可以在sitemesh-example.war 找到例子。

    通常第一條規則僅用來確定該裝飾器是否被使用(Conceptually, the first rule that evaluates to true determines the decorator that is used. )在上面的例子中,當出現printable=true 參數的時候,裝飾器printable.jsp (規則 #3)替代了 main.jsp (規則 #5)。在SiteMesh中,這些規則被描述為 mappers。

    3 :  decorators/*.jsp

    這三個decorators目錄下的文件是decorators.xml文件中描述的不同裝飾器JSP文件。上面是一個簡單的裝飾器例子,在后面我們將討論更復雜的示例。


    4 :  sitemesh-2.0.1.jar

    這是SiteMesh最主要的二進制文件,通常被安裝在 WEB-INF/lib 目錄下。可以在www.opensymphony.com/sitemesh/api 找到這個庫的javadoc。

    *.tld

    SiteMesh使用兩個標簽庫,但大多數人都只需要sitemesh-decorator.tld。還有一個是 :sitemesh-page.tld 你可以在 www.opensymphony.com/sitemesh/tags.html 找到相應的文檔。我們已經講述了最主要的標簽:head,title和body。在下一章我們來討論剩下的標簽:getProperty。

    posted on 2007-06-11 10:36 扭曲的鉛筆 閱讀(529) 評論(0)  編輯  收藏 所屬分類: SiteMesh

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品欧美综合四区| 亚洲最大黄色网址| 菠萝菠萝蜜在线免费视频| 成年人免费观看视频网站| 亚洲日日做天天做日日谢| 亚洲中文无码永久免费| 亚洲人xxx日本人18| 永久免费av无码不卡在线观看| 亚洲午夜精品一区二区公牛电影院| 黄色成人免费网站| ww亚洲ww在线观看国产| 在线观看永久免费视频网站| 在线看亚洲十八禁网站| 亚洲人成无码网WWW| 国产在线观a免费观看| 亚洲国产美国国产综合一区二区| 91在线老王精品免费播放| 亚洲精品成人图区| 最新中文字幕免费视频| 美女黄色毛片免费看| 亚洲色成人WWW永久网站| 91在线老王精品免费播放| 亚洲熟妇成人精品一区| 亚洲精品岛国片在线观看| 日本免费中文视频| 亚洲日本va在线观看| 亚洲国产婷婷综合在线精品| 美女在线视频观看影院免费天天看| 亚洲图片激情小说| 国产免费观看黄AV片| 一个人免费视频在线观看www| 亚洲综合激情另类小说区| 国产精品国产免费无码专区不卡| 国产日韩在线视频免费播放| 亚洲国产综合在线| 亚洲AV无码一区二区三区在线观看| 久久久久久AV无码免费网站| 亚洲av成人一区二区三区观看在线 | 免费下载成人电影| 五月天婷婷免费视频| 久久精品亚洲一区二区三区浴池|