Sitemesh 3 模板框架使用

1 . Sitemesh 3 簡介
Sitemesh 是一個網頁佈局和修飾的框架,基於 Servlet 中的 Filter,類似於 ASP.NET 中的‘母版頁’技術。參考:百度百科,相關類似技術:Apache Tiles。
官網:http://wiki.sitemesh.org/wiki/display/sitemesh/Home
這裏寫圖片描述
2 . Sitemesh 3 下載
最新版本:3.0.0-SNAPSHOT
① GitHub 地址:https://github.com/sitemesh/sitemesh3
② maven:

<dependency>  
       <groupId>org.sitemesh</groupId>  
       <artifactId>sitemesh</artifactId>  
       <version>3.0.0</version>  
  </dependency>  

3 . 配置 Sitemesh 3 過濾器
在 web.xml 中添加 Sitemesh Filter:

<web-app>  

  ...  

  <filter>  
    <filter-name>sitemesh</filter-name>  
    <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>sitemesh</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  

</web-app>  

4 . 準備兩個頁面:demo.html 和 decorator.html
① demo.html - “被裝飾的頁面”,實際要呈現的內容頁

<!DOCTYPE html>  
<html>  
<head>  
    <title>內容頁的標題</title>  
</head>  
<body>  
    內容頁的body部分  
</body>  
</html>  

② decorator.html - “裝飾頁面”,所謂的“母版頁”。

<!DOCTYPE html>  
<html>  
<head>  
<title>  
    <sitemesh:write property='title' /> - ltcms  
</title>  
<sitemesh:write property='head' />  
</head>  
<body>  
    <header>header</header>  
    <hr />  
    demo.html的title將被填充到這兒:  
    <sitemesh:write property='title' /><br />  
    demo.html的body將被填充到這兒:  
    <sitemesh:write property='body' />  
    <hr />  
    <footer>footer</footer>  
</body>  
</html> 

5 . 添加 /WEB-INF/sitemesh3.xml

<?xml version="1.0" encoding="UTF-8"?>  
<sitemesh>  
    <!-- 指明滿足“/*”的頁面,將被“/WEB-INF/views/decorators/decorator.html”所裝飾 -->  
    <mapping path="/*" decorator="/WEB-INF/views/decorators/decorator.html" />  

    <!-- 指明滿足“/exclude.jsp*”的頁面,將被排除,不被裝飾 -->  
    <mapping path="/exclude.jsp*" exclue="true" />  
</sitemesh>  

6 . 運行效果
訪問 demo.html 頁面,實際效果如下:

這裏寫圖片描述
7 . sitemesh3.xml 配置詳解

<sitemesh>  
    <!--默認情況下,  
        sitemesh 只對 HTTP 響應頭中 Content-Type 爲 text/html 的類型進行攔截和裝飾,  
        我們可以添加更多的 mime 類型-->  
  <mime-type>text/html</mime-type>  
  <mime-type>application/vnd.wap.xhtml+xml</mime-type>  
  <mime-type>application/xhtml+xml</mime-type>  
  ...  

  <!-- 默認裝飾器,當下面的路徑都不匹配時,啓用該裝飾器進行裝飾 -->  
  <mapping decorator="/default-decorator.html"/>  

  <!-- 對不同的路徑,啓用不同的裝飾器 -->  
  <mapping path="/admin/*" decorator="/another-decorator.html"/>  
  <mapping path="/*.special.jsp" decorator="/special-decorator.html"/>  

  <!-- 對同一路徑,啓用多個裝飾器 -->  
  <mapping>  
    <path>/articles/*</path>  
    <decorator>/decorators/article.html</decorator>  
    <decorator>/decorators/two-page-layout.html</decorator>  
    <decorator>/decorators/common.html</decorator>  
  </mapping>  

  <!-- 排除,不進行裝飾的路徑 -->  
  <mapping path="/javadoc/*" exclue="true"/>  
  <mapping path="/brochures/*" exclue="true"/>  

  <!-- 自定義 tag 規則 -->  
  <content-processor>  
    <tag-rule-bundle class="com.something.CssCompressingBundle" />  
    <tag-rule-bundle class="com.something.LinkRewritingBundle"/>  
  </content-processor>  
  ...  

</sitemesh>  

8 . 自定義 tag 規則
Sitemesh 3 默認只提供了 body,title,head 等 tag 類型,我們可以通過實現 TagRuleBundle 擴展自定義的 tag 規則:

import org.sitemesh.SiteMeshContext;  
import org.sitemesh.content.ContentProperty;  
import org.sitemesh.content.tagrules.TagRuleBundle;  
import org.sitemesh.content.tagrules.html.ExportTagToContentRule;  
import org.sitemesh.tagprocessor.State;  

public class MyTagRuleBundle implements TagRuleBundle {  
    public void install(State defaultState, ContentProperty contentProperty,  
            SiteMeshContext siteMeshContext) {  
        defaultState.addRule("myContent", new ExportTagToContentRule(siteMeshContext, contentProperty.getChild("myContent"), false));  

    }  

    public void cleanUp(State defaultState, ContentProperty contentProperty,  
            SiteMeshContext siteMeshContext) {  
    }  
}  

最後在 sitemesh3.xml 中配置即可:

<?xml version="1.0" encoding="UTF-8"?>  
<sitemesh>  
    <!-- 指明滿足“/*”的頁面,將被“/WEB-INF/views/decorators/decorator.html”所裝飾 -->  
    <mapping path="/*" decorator="/a.jsp" />  

    <!-- 指明滿足“/exclude.jsp*”的頁面,將被排除,不被裝飾 -->  
    <mapping path="/a.jsp*" exclue="true" />  
 <span style="color:#FF0000;">    <content-processor>  
             <tag-rule-bundle class="MyTagRuleBundle" />  
     </content-processor></span>  
</sitemesh>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章