1.SiteMesh介紹
SiteMesh是一個網(wǎng)頁布局和修飾的框架蠕啄,利用它可以將網(wǎng)頁的內(nèi)容和頁面結(jié)構(gòu)分離,以達到頁面結(jié)構(gòu)共享的目的锄贼。[來自百度百科]
通俗的理解就是曲稼,SiteMesh把頁面中變化的和不變的分離開來,用不變的去裝飾各種變化的內(nèi)容待锈。從而使頁面具有統(tǒng)一的布局漠其,而且方便頁面的管理。不變的頁面稱之為裝飾頁面竿音,內(nèi)容變化的頁面稱之為被裝飾頁面和屎。 裝飾頁面一般包括:頁面標(biāo)題、頭部春瞬、底部柴信、主體以及公共的css、js宽气。 被裝飾頁面只需要寫它自己需要的內(nèi)容就可以了随常。
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 . 準(zhǔn)備兩個頁面:demo.html 和 decorator.html
① demo.html - “被裝飾的頁面”潜沦,實際要呈現(xiàn)的內(nèi)容頁。
<!DOCTYPE html>
<html>
<head>
<title>內(nèi)容頁的標(biāo)題</title>
</head>
<body>
內(nèi)容頁的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 響應(yīng)頭中 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>
...
<!-- 默認裝飾器,當(dāng)下面的路徑都不匹配時猿涨,啟用該裝飾器進行裝飾 -->
<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 規(guī)則 -->
<content-processor>
<tag-rule-bundle class="com.something.CssCompressingBundle" />
<tag-rule-bundle class="com.something.LinkRewritingBundle"/>
</content-processor>
...
</sitemesh>
8 . 自定義 tag 規(guī)則
Sitemesh 3 默認只提供了 body舆瘪,title,head 等 tag 類型红伦,我們可以通過實現(xiàn) TagRuleBundle 擴展自定義的 tag 規(guī)則:
public class MyTagRuleBundle implements TagRuleBundle {
@Override
public void install(State defaultState, ContentProperty contentProperty,
SiteMeshContext siteMeshContext) {
defaultState.addRule("myHeader", new ExportTagToContentRule(contentProperty.getChild("myHeader"), false));
}
@Override
public void cleanUp(State defaultState, ContentProperty contentProperty,
SiteMeshContext siteMeshContext) {
}
}
最后在 sitemesh3.xml 中配置即可:
<content-processor>
<tag-rule-bundle class="com.lt.common.ext.sitemesh3.MyTagRuleBundle" />
</content-processor>