1.安装sitemesh插件
与整合其他框架类似,struts2与sitemesh框架的整合也使用了插件方式进行管理 。将struts2-sitemesh-plugin-2.0.6.jar文件复制到WEB-INF/lib下,为了整合sitemesh框架,必须在web.xml中配置sitemesh过滤器,让该核心过滤器来过滤所有的用户请求。但我们知道,struts2的所有值一旦访问该stack context或ValueStack后,里面对应的数值将会被清除掉,如果先使用了struts2的FilterDispather来过滤用户请求,则sitemesh的过滤器将无法取得Stack context或者ValueStack中的数据
为了解决这个问题,struts2提供了ActionContextCleanUp类,在struts2的架构中,标准的过滤器一般以ActionContextCleanUp开始,后面跟着其他需要的过滤器,最后,由FilterDispatcher来处理请求,FilterDispatcher通常是将请求传递给ActionMapper
ActionContextCleanUp的一个重要作用是整合sitemesh页面装饰器,它通知FilterDispatcher在正确的时间清除ActionContext中的请求数据,所以正确的排序如下:
(1)ActionContextCleanUp过滤器
(2)SiteMesh核心过滤器
(3)FilterDispatcher过滤器
web.xml
<web-app id="jsf" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- ��struts2�ܹ��У����Ĺ�����tһ����ActionContextCleanUp��ʼ���������������Ҫ�Ĺ����������FilterDispatcher�������� -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<!-- JavaServer Faces Servlet Configuration, not used directly -->
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- JavaServer Faces Servlet Mapping, not called directly -->
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
spring配置文件
<!-- 指定Spring配置文件的Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bs" class="lee.service.BookService"/>
</beans>
sitemesh装饰配置文件
<decorators defaultdir="/decorators">
<!-- 在excludes元素下指定的页面将不会由SiteMesh来装饰 -->
<excludes>
<pattern>/exclude.jsp</pattern>
<pattern>/exclude/*</pattern>
</excludes>
<!-- 创建一个名为main的装饰器,该装饰器页面为main.jsp,
用于装饰pattern指定的URL的所有页面-->
<decorator name="main" page="main.jsp">
<pattern>/*</pattern>
</decorator>
<!-- 定义一个装饰器,但该装饰器默认不装饰任何页面 -->
<decorator name="panel" page="panel.jsp"/>
</decorators>
装饰器decorators/main.jsp
<%...@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%...@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
<html>
<head>
<title><decorator:title default="SiteMesh的装饰器页"/></title>
<link href="decorators/main.css" rel="stylesheet" type="text/css">
<decorator:head/>
</head>
<body>
<table width="100%" height="100%">
<tr>
<td valign="top">
<!-- 引入一个页面,临时指定所用的装饰器 -->
<page:applyDecorator page="/book.html" name="panel" />
<page:applyDecorator page="/link.html" name="panel" />
</td>
<td width="100%">
<table width="100%" height="100%">
<tr>
<td id="pageTitle">
<decorator:title/>
</td>
</tr>
<tr>
<td valign="top" height="100%">
<decorator:body />
</td>
</tr>
<tr>
<td id="footer">
<b>被包含的内容</b><br>
SithMesh提供页面装饰支持
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
装饰器decorators/panel.jsp
<%...@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<p>
<table width=250 border=0 cellpadding=0 cellspacing=0>
<tr>
<th class="panelTitle">
<decorator:title default="小面板页面" />
</th>
</tr>
<tr>
<td class="panelBody">
<decorator:body />
</td>
</tr>
</table>
</p>
装饰器样式decorators/main.css
font: normal x-small verdana, arial, helvetica, sans-serif;
}
.panelTitle {
background-color: #003399;
color:#eeeeee;
font-weight: bold;
border-color: #3366ff #000033 #000033 #3366ff;
border-width: 1;
border-style: solid;
padding: 1;
}
.panelBody {
background-color: #eeeeee;
border-color: black;
border-width: 0 1 1 1;
border-style: solid;
padding: 2;
}
#pageTitle {
background-color: #003399;
color:#eeeeee;
font-weight: bold;
font-size: large;
border-color: #3366ff #000033 #000033 #3366ff;
border-width: 1;
border-style: solid;
padding: 1;
text-align: center;
}
#footer {
background-color:#eeeeee;
font-size: 9pt;
text-align: center;
color: black;
border-color: #666666 #cccccc #cccccc #666666;
border-width: 1;
border-style: solid;
padding: 1;
}
被装饰页面book.html
<head>
<title>作者图书</title>
</head>
<body>
<center>
Spring2.0宝典<br>
轻量级J2EE企业应用实战<br>
基于J2EE的Ajax宝典