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 - “被装饰的页面”,实际要呈现的内容页。
<!DOCTYPEhtml>
<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 .sitemesh配置方式
1)使用xml的配置方式:
添加 /WEB-INF/sitemesh3.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<sitemesh>
<!--指明满足“/*”的页面,将被“/WEB-INF/views/decorators/decorator.html”所装饰-->
<mappingpath="/*"decorator="/WEB-INF/views/decorators/decorator.html"/>
<!--指明满足“/exclude.jsp*”的页面,将被排除,不被装饰-->
<mappingpath="/exclude.jsp*"exclue="true"/>
</sitemesh>
2)使用java代码的配置方式
java常用公共配置方式:
publicclassMySiteMeshFilterextendsConfigurableSiteMeshFilter{
@Override
protectedvoidapplyCustomConfiguration(SiteMeshFilterBuilder builder){
//Mapdefaultdecorator.Thisshallbeappliedtoallpathsifnootherpathsmatch.
builder.addDecoratorPath("/*","/default-decorator.html")
//Mapdecoratorstopathpatterns.
.addDecoratorPath("/admin/*","/another-decorator.html")
.addDecoratorPath("/*.special.jsp","/special-decorator.html")
//Mapmultipledecoratorstotheasinglepath.
.addDecoratorPaths("/articles/*","/decorators/article.html",
"/decoratos/two-page-layout.html",
"/decorators/common.html")
//Excludepathfromdecoration.
.addExcludedPath("/javadoc/*")
.addExcludedPath("/brochures/*");
}
}
Note: If you also have an XML config file, SiteMesh will load this before calling applyCustomConfiguration(). This allows you to use XML for some configuration and Java for more advanced aspects.
注意:如果你同时拥有xml配置文件,sitemesh将会在调用applyCustomConfiguration() 前优先加载它。这种方式可以帮助你使用xml完成某些配置,然后使用java完成更高级的层面的配置
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>
...
<!--默认装饰器,当下面的路径都不匹配时,启用该装饰器进行装饰-->
<mappingdecorator="/default-decorator.html"/>
<!--对不同的路径,启用不同的装饰器-->
<mappingpath="/admin/*"decorator="/another-decorator.html"/>
<mappingpath="/*.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>
<!--排除,不进行装饰的路径-->
<mappingpath="/javadoc/*"exclue="true"/>
<mappingpath="/brochures/*"exclue="true"/>
<!--自定义tag规则-->
<content-processor>
<tag-rule-bundleclass="com.something.CssCompressingBundle"/>
<tag-rule-bundleclass="com.something.LinkRewritingBundle"/>
</content-processor>
...
</sitemesh>
8 . 自定义 tag 规则
Sitemesh 3 默认只提供了 body,title,head 等 tag 类型,我们可以通过实现 TagRuleBundle 扩展自定义的 tag 规则:
publicclassMyTagRuleBundleimplementsTagRuleBundle{
@Override
publicvoidinstall(State defaultState,ContentProperty contentProperty
,SiteMeshContext siteMeshContext){
defaultState.addRule("myHeader",
newExportTagToContentRule(contentProperty.getChild("myHeader"),false));
}
@Override
publicvoidcleanUp(State defaultState,ContentProperty contentProperty,
SiteMeshContext siteMeshContext){
}
}
最后在 sitemesh3.xml 中配置即可:
<content-processor>
<tag-rule-bundle class="com.lt.common.ext.sitemesh3.MyTagRuleBundle" />
</content-processor>