一、背景
最近在看activemq的时候,无意看到其web操作页面的结构框架很有意思,刚开始有点懵,但仔细摸索半天并结合度娘的力量,发现它是使用了 sitemesh应用Decorator模式,在进行了入门学习和几个小例子的实践之后,我趁热写了此文,以便下次回顾的时候可以复看一下
二、介绍
Sitemesh是由一个基于Web页面布局、装饰Decorator及与现存Web应用整合的框架。它能帮助我们在由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、一致的banner、一致的版权等。它不仅能处理动态的内容,如JSP、PHP、ASP、CGI等产生的内容,还能处理静态的内容,比如HTML的内容,使得它的内容也符合你的页面结构的要求。甚至它能像include那样将HTML文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。装饰模式是在不必改变原类文件和使用集成的情况下,动态地扩展一个对象的功能。它能通过创建一个包装对象,也就是装饰来包裹的对象。尽管它是由Java语言来实现的,但是它能与其他Web应用很好的集成
三、原理
SiteMesh是基于Servlet的filter的,即过滤流。它是通过截取response,并进行装饰后再交付给客户。
其中涉及到两个名词: 装饰页面(decorator page)和 "被装饰页面(Content page)" , 即 SiteMesh通过对Content Page的装饰,最终得到页面布局和外观一致的页面,并返回给客户
sitemesh运行环境需要:servlet, JDK 。
四、使用
3.1、decorator的实现(参照activemq的文件结构与配置,看的懵的可以去对着activemq看)
https://github.com/sitemesh/sitemesh3下载我们需要的jar包:sitemesh-3.0.1.jar
a、在我们的web.xml中配置如下信息:
<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>
配置这个过滤器,对所有的请求进行过滤
b、 在WEB-INF目录下新建一个decorators.xml文件(/decorator是你的包装jsp根路径,此处即为目录:webapps/应用
名/decorators,下面定义的main.jsp,panel.jsp,printable.jsp都是放在该目录下的)
<decorators defaultdir="/decorators">
<excludes>
<pattern>/xml/*</pattern>
<pattern>/slave.jsp</pattern>
<pattern>/index2.jsp</pattern>
</excludes>
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
<decorator name="panel" page="panel.jsp" />
<decorator name="printable" page="printable.jsp" />
</decorators>
<decorator></decorator>定义装饰页面,<pattern>/*</pattern>定义该装饰页面匹配的路径,/*代表匹配所有的页面
<excludes></excludes>定义不需要拦截的地址