`
xiongzhenhui
  • 浏览: 209771 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

struts2.0与SiteMesh整合

阅读更多

1.在工程中引入SiteMesh的必要jar包,和struts2-sitemesh-plugin-2.0.8.jar(该包在strut2.0的lib目录中可以找到);

 

2.Struts2的所有值是保存在Stack Context或者ValueStack中的,默认情况是,
某个过滤器一旦访问了该Stack Context或ValueStack后,里面对应的值将会被清除掉,
如果先使用Struts2的FilterDispatcher来过滤用户请求,
则SiteMesh的过滤器将无法取得Stack Context或者ValueStack中的数据。
为了解决整个问题,Struts2提供了ActionContextCleanUp类。在Struts2的架构中,
标准的过滤器链(filter-chain)一般以 ActionContextCleanUp 开始,后面跟着其他需要的过滤器,
最后,由 FilterDispatcher来处理请求,FilterDispatcher通常是将请求传递给ActionMapper
但问题是:ActionContextCleanUp过滤器只能保证在FilterDispatcher之前先不清除Stack Context和ValueStack中的值。
如果将SiteMesh过滤器排在FilterDispatcher之后,这会导致SiteMesh过滤器无法访问到Stack Context和ValueStack中的值。
因此,为了让SiteMesh过滤器和FilterDispatcher都可访问到Stack Context和ValueStack中的值,
且FilterDispatcher可以在合适时机清除Stack Context和ValueStack中的值,应该使用如下的过滤器顺序:
(1)ActionContextCleanUp过滤器。
(2)SiteMesh核心过滤器。
(3)FilterDispatcher过滤器。

 

3.

  struts2.13前配置如下:

  1. filter>  
  2.    <filter-name>ActionContextCleanUp</filter-name>  
  3.    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
  4. </filter>  
  5. <filter>  
  6.    <filter-name>sitemesh</filter-name>  
  7.    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>  
  8. </filter>  
  9. <filter>  
  10.    <filter-name>struts2</filter-name>  
  11.    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  12. </filter>  

 从struts2.1.3开始ActionContextCleanUp 和 FilterDispatcher过滤器,已经不建议使用了。将使用StrutsPrepareFilter 和StrutsExecuteFilter拦截器替代。正确的配置方式如下:

 

Xml代码 复制代码 收藏代码
  1. <filter>  
  2.         <filter-name>struts-prepare</filter-name>  
  3.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>  
  4.     </filter>  
  5.     <filter>  
  6.         <filter-name>sitemesh</filter-name>  
  7.         <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>  
  8.     </filter>  
  9.     <filter>  
  10.         <filter-name>struts-execute</filter-name>  
  11.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>  
  12.     </filter>  
  13.        
  14.     <filter-mapping>  
  15.         <filter-name>struts-prepare</filter-name>  
  16.         <url-pattern>/*</url-pattern>  
  17.     </filter-mapping>  
  18.     <filter-mapping>  
  19.         <filter-name>sitemesh</filter-name>  
  20.         <url-pattern>/*</url-pattern>  
  21.         <dispatcher>REQUEST</dispatcher>  
  22.         <dispatcher>FORWARD</dispatcher>  
  23.         <dispatcher>INCLUDE</dispatcher>  
  24.     </filter-mapping>  
  25.     <filter-mapping>  
  26.         <filter-name>struts-execute</filter-name>  
  27.         <url-pattern>/*</url-pattern>  
  28.     </filter-mapping>  
  29.        
  30.     <servlet>  
  31.         <servlet-name>sitemesh-freemarker</servlet-name>  
  32.         <servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class>  
  33.         <init-param>  
  34.             <param-name>default_encoding</param-name>  
  35.             <param-value>UTF-8</param-value>  
  36.         </init-param>  
  37.         <load-on-startup>1</load-on-startup>  
  38.     </servlet>  
  39.     <servlet-mapping>  
  40.         <servlet-name>sitemesh-freemarker</servlet-name>  
  41.         <url-pattern>*.ftl</url-pattern>  
  42.     </servlet-mapping>  
  43.     <listener>  
  44.         <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>  
  45.     </listener>  
<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>
	
	<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>
	<listener>
        <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>
    </listener>

    注意:

    1. com.opensymphony.sitemesh.webapp.SiteMeshFilter这个过滤器是必需的,否则装饰不起作用

    2. 为了支持FreeMaker或Velocity,必须添加org.apache.struts2.sitemesh.FreemarkerDecoratorServlet这个Servlet,官方原话:

写道
From 2.2+ the recommended way to use Freemarker with Sitemesh is through the org.apache.struts2.sitemesh.FreemarkerDecoratorServlet servlet

    3. 而已从2.2.x开始,必须添加org.apache.struts2.dispatcher.ng.listener.StrutsListener这个监听器

写道
From 2.2+ the new com.opensymphony.sitemesh.webapp.SiteMeshFilter filter and Struts org.apache.struts2.dispatcher.ng.listener.StrutsListener context listener must be added to web.xml,

 

4.在webroot目錄下面建decorators文件夾,裡面放裝飾的模型main.jsp(decorators是装饰文件默认路径)

<%@ page contentType="text/html;charset=UTF-8"%>
<%@taglib prefix="decorator"
 uri="http://www.opensymphony.com/sitemesh/decorator"%>> //导入sitemesh标签库
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%<html>
 <head>
  <title><decorator:title /></title>
  <decorator:head />
 </head>
 <body>
  <p>
   Add head decorator...
  </p>
  <decorator:body />
  <p>
   Add foot decorator...
  </p>
 </body>
</html>

 

5.配置decorators-file文件.該文件名称和路径为sitemesh-default.xml中 <property name="decorators-file" value="/WEB-INF/decorators.xml"/>配置的名称.所以该文件必须放在WEB-INF目录下.名称为decorators.xml.

decorators.xml配置如下:

<?xml version="1.0" encoding="utf-8"?>
<decorators defaultdir="/decorators"> //其中/decorators是装饰文件默认路径.也可以配置为其他路径
<!--excludes結點則指定了哪些路徑的請求不使用任何模板-->
<excludes>
<pattern>/index.jsp*</pattern>
<pattern>/login/*</pattern>
</excludes>
<!--decorator結點指定了模板的位置和文件名,通過pattern來指定哪些路徑引用哪個模板-->
<decorator name="main" page="mode.jsp">
<pattern>/*</pattern>
</decorator>
</decorators>

分享到:
评论

相关推荐

    Struts2.0 与 sitemesh的例子

    将Struts2.0与Sitemesh整合,可以让Struts2处理业务逻辑,而Sitemesh负责页面的装饰和布局。这样,开发者可以专注于业务代码编写,而无需关心页面的样式细节。通常,整合步骤包括: 1. **添加依赖**:在项目中引入...

    struts2.1.6+spring2.0+hibernate3.2常用配置包

    1 spring的相关包,先添加struts2.0的支持时标记的包; 2 struts2的相关包;以struts2-core-2.1.6版本为准; 注:struts2-core-2.1.8有较大变化需要注意替换相关包,注意尾号尽量不要是单号 例子:xwork-2.1.2....

    Struts2.1权威指南——基于WebWork核心的MVC开发.pdf

    - **版本更新**:本书介绍的是最新的Struts2.1版本,相比于2007年发布的Struts2.0,Struts2.1做了较多改进与新增功能。 - **新特性**: - REST支持:简化了基于RESTful Web服务的开发过程。 - Convention插件:...

    使用dwr2.0实现服务器推客户端

    `struts-cleanup`和`sitemesh`过滤器是整合SiteMesh所必需的,它们分别清理ActionContext和应用PageFilter来处理页面装饰。 3. **Struts2过滤器**: `&lt;filter-name&gt;struts2&lt;/filter-name&gt;`定义了Struts2的核心过滤...

    Java的Struts框架简介与环境配置教程

    4. **易整合性**:Struts2可以轻松地与Spring、Tiles、SiteMesh等其他框架集成,增强了系统的扩展性。 5. **模板支持**:支持多种模板技术,如JSP、Freemarker、Velocity和XSLT,开发者可以根据需求选择合适的视图...

    WEB开发经验总结与交流

    Struts与Spring、Hibernate或Ibatis的整合,使其在处理复杂业务逻辑方面表现出色。开发者应根据项目需求和团队熟悉程度选择合适的框架,不必盲目追求最新潮的技术,适用性和稳定性是首要考虑因素。 其次,...

    宏天JAVA开发平台

    该平台涵盖了Spring2.5、Struts2.0.14、SpringSecurity2.0、SpringAOP、Hibernate3.3GA、FCKEditor2.6、EXT3、CXF2.0、JBPM4.4GA、Compass+Lucene、JasperReport4、JavaMail等一系列前沿技术组件,以及Log4j、...

Global site tag (gtag.js) - Google Analytics