SiteMesh是一个轻量级的web应用框架,实现了Decorator模式。它的目标是将多个页面都将引用的jsp页面经过配置加载到相应的jsp文件中。web
在咱们的项目中,每一个jsp都须要添加两个top和bottom的jsp来完成某些功能。最笨的方法固然就是在每一个页面上hard code这些功能的相关代码,可是这样的作法实在是不知足DRY的原则。clean code须要咱们最大程度的复用咱们的代码,减小代码冗余。服务器
SiteMesh提供了这样的解决方案:使用decorator模式来动态的给每一个jsp页面添加额外的职责。使用了Decorator模式后每一个页面就能够专一于解决本页面要解决的问题,而不须要关心那些全局上须要每一个页面完成的功能模块了。app
SiteMesh的工做原理十分简单:使用一个filter对每一个发送到服务器的请求进行过滤;对照配置文件确认该请求的目标jsp是否知足decorator的条件(是否须要被decorate);对须要decorate的页面,使用配置文件中指定的装饰规则把指定的文件(如header,footer等)与目标页面组合起来,把结果返回给客户端。框架
详细的作法是:jsp
1.引入SiteMesh的引用this
<dependency> <groupId>opensymphony</groupId> <artifactId>sitemesh</artifactId> <version>2.4.2</version> </dependency>
2.在web.xml文件中配置filterurl
<filter> <filter-name>sitemesh</filer-name> <filter-class>com.opensymphony.sitemesh.webspp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping>
这样的配置表明我但愿对全部的jsp都进行decoratespa
3.编写decorators.xmlcode
<decorators defaultdir="/path/to/decorators/file"> <excludes> <pattern>/exclude/specific/kind/of/files/in/this/folder</pattern> </excludes> <decorator name="myDecorator" page="FileNameOfTheDecorateRule"> <pattern>*.jsp</pattern> </decorator> </decorators>
excludes节点定义了哪些在decorator目录下,可是我又不想其被装饰的文件。xml
4.编写定义decorate rules的jsp模板
这里的decorate rules就是在decorators.xml文件中定义的“myDecorator”,其中详细定义了对目标文件的装饰规则。包括:用什么文件对目标文件进行装饰,在目标文件的哪一个位置进行装饰等等。它通常是一个jsp文件,或者说是一个模板。在这个模板中写入须要decorate的详细内容,格式规范与普通jsp相同,可是有两个重要的标签:
<decorator:head/> <decorator:body/>
当对目标页面进行装饰的时候,遇到<decorator:head/>就插入目标文件的<head>部分,遇到<decorator:body/>就插入目标文件的<body>部分。
这样,根据目标文件的不一样,就动态的生成了具备相同附加职责的不一样的页面。