Sitemesh是一个页面装饰框架,可以让整个网站的所有网页都组织为一种统一的风格。一般网页都是由header、content、footer组成,再加上菜单条或者导航条。使用sitemesh,你可以将每个页面都相同的元素都制作为模板,然后每个具体页面只编写最基本的代码,然后通过sitemesh来将其它内容“装饰”到页面上,生成最终的页面展现给用户。这样做的好处就是,页面的编写者甚至都不知道整个网站使用的哪个模板,只需要关注自己页面的实现即可,最后都是统一的风格;而如何要给网站换一个模板,那也是简单之极的事情。
类似sitemesh的库还有apache tiles。tiles将重复内容都分割成一个个的小片断,这些小片断就可以重复使用,在页面中直接引入这些片断就可以了。不过比较了一下,tiles没有像sitemesh这样统一的管理,需要由页面编写时就要说明使用哪些内容。如果网站有可能整体性的修改风格,个人感觉sitemesh要傻瓜一些。
sitemesh主页是:
http://www.opensymphony.com/sitemesh/,不过很奇怪这个网站上的内容都无法下载。在网上找了一下,在GitHub(
https://github.com/sitemesh)上可以下载到源码,包括最新的3.0。如果只需要jar文件,可以通过maven来下载。目前我在SSH整合框架使用的是2.4.2,整合的步骤如下。
将sitemesh-2.4.2.jar文件复制到lib目录下,然后对工程进行配置:
1. 编辑web.xml,主要是以下内容:
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter>
<filter-name>struts-execute</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-prepare</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>
</listener>
这三个filter插入的顺序都无所谓,但是filter-mapping的顺序必须是struts-prepare、sitemesh、struts-execute的顺序,否则有问题。
2. 如果需要支持freemarker和velocity,则必须在web.xml中配置以下内容
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>JspSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3. 在WEB-INF目录下建立sitemesh.xml文件,内容如下:
<sitemesh>
<property name="decorators-file" value="/WEB-INF/decorators.xml"/>
<excludes file="${decorators-file}"/>
<page-parsers>
<parser default="true"
class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
<parser content-type="text/html"
class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
<parser content-type="text/html;charset=utf-8"
class="com.opensymphony.module.sitemesh.parser.HTMLPageParser"/>
</page-parsers>
<decorator-mappers>
<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
<param name="config" value="${decorators-file}"/>
</mapper>
</decorator-mappers>
</sitemesh>
4.
在WEB-INF目录下建立decorators.xml文件,内容如下:
<decorators defaultdir="/decorators">
<excludes>
<pattern>**ajax=true</pattern>
<pattern>/dojo/*</pattern>
<pattern>/struts/*</pattern>
</excludes>
<decorator name="default" page="default.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>
这个配置指明了使用default.jsp来作为装饰的模板
5. 在WEB的根目录下建立decorators目录,在此目录下建立default.jsp文件。这个就是具体的模板文件,类似如下的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
<decorator:title default="这里是标题" /></title>
<decorator:head />
</head>
<body>
<div class="container">
<div class="header"></div>
<div class="content">
<decorator:body />
</div>
<div class="footer"></div>
</div>
</body>
</html>
这里使用到的几个标签:
<decorator:title /><decorator:head /><decorator:body />,分别会使用被装饰页面的title、head、body的内容替换掉。