`
xiongzhenhui
  • 浏览: 209666 次
  • 性别: 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与sitemesh整合所需架包

    这将告诉Struts2如何与Sitemesh协作。 ```xml &lt;constant name="struts.plugins" value="com.opensymphony.sitemesh.webapp.decorator.struts2.Struts2DecoratorPlugin"/&gt; &lt;constant name="struts.action....

    Struts2整合SiteMesh

    将Struts2与SiteMesh整合,可以实现更加统一和规范化的网站外观,并减少重复代码。 整合Struts2和SiteMesh主要涉及以下几个步骤: 1. **添加依赖**:首先,在项目中引入SiteMesh的jar包。如果使用的是Maven,可以...

    Struts2整合SiteMesh技巧

    通过整合Struts2与SiteMesh,开发者可以在保持Struts2框架的灵活性的同时,利用SiteMesh实现一致且美观的页面布局设计。 #### 配置基础 要使Struts2与SiteMesh协同工作,首先需要确保项目中包含了以下三个库文件:...

    struts2-sitemesh-plugin-2.2.1.1.jarstruts2

    `struts2-sitemesh-plugin-2.2.1.1.jar`是Struts2框架与Sitemesh集成的插件,使得Struts2应用能够利用Sitemesh的功能来美化和规范化页面布局。 **Struts2框架** Struts2的核心功能包括动作映射、结果处理、数据绑定...

    struts2-sitemesh-plugin-2.0.8.jar

    struts2-sitemesh-plugin-2.0.8.jar

    struts2-sitemesh-plugin-2.1.6.jar

    struts2-sitemesh-plugin-2.1.6.jar

    struts2+sitemesh例子

    **Struts2与Sitemesh集成** 将Struts2和Sitemesh集成,可以充分利用两者的优点,创建既有良好结构又美观的Web应用。集成过程主要包括以下步骤: 1. 添加Sitemesh的依赖到项目中,通常在Maven的pom.xml文件中添加...

    struts2.0必可不少的包

    - `struts2-sitemesh-plugin`: 集成了Sitemesh,用于页面布局和装饰,可以统一网站的外观和风格。 5. **动作(Action)支持**: - `struts2-json-plugin`: 提供JSON支持,使Action可以直接返回JSON格式的数据,...

    Struts2.0+Hibernate+Spring注册登录系统

    Struts2.0+Hibernate+Spring是一个经典的Java Web开发技术栈,这一体系结构被广泛应用于构建企业级的Web应用程序,尤其是那些需要高效数据管理、强大业务逻辑和灵活控制层的系统。在这个“Struts2.0+Hibernate+...

    struts2-sitemesh-plugin-2.0.6.jar

    struts框架与sitemesh框架整合的插件,在java web开发中可以制作模板页,使自己做的网站看起来更专业

    struts2-sitemesh-plugin-2.1.8.1.jar

    struts2-sitemesh-plugin-2.1.8.1.jar

    struts2-sitemesh-plugin-2.3.15.1

    解决 java.lang.NoSuchFieldException: DEFAULT_PARAM&gt;问题,下载后替换即可。

    freemarker 与sitemesh 整合例子

    这些文件可以作为学习和实践Freemarker与Sitemesh整合的起点,帮助开发者理解如何在实际项目中应用这两种技术。 通过这样的整合,开发者可以利用Freemarker的强大模板语言处理动态内容,同时借助Sitemesh保持页面的...

    北大青鸟struts2.0培训基础教程

    6. **集成性**:Struts2可以与Spring、SiteMesh和Tiles等其他框架无缝集成,提高开发效率。 7. **OGNL集成**:OGNL(Object-Graph Navigation Language)是Struts2中的默认表达式语言,提供了强大的数据访问和操作...

    一个Struts2+Spring2.5+SiteMesh的小DEMO

    Struts2、Spring2.5 和 SiteMesh 是Java Web开发中的三个重要框架,它们共同构建了一个强大且灵活的Web应用程序架构。在这个小DEMO中,我们将深入探讨这三个框架的集成和工作原理。 **Struts2** 是一个基于MVC...

    struts2-sitemesh_入门收集

    虽然 Apache Tiles 在 Web 开发领域也有广泛的应用,特别是在与 Struts 框架结合时,但相较于 SiteMesh,它存在一些局限性: 1. **配置繁琐**:在 Tiles 中,每个页面都需要在配置文件中明确指定,这不仅增加了开发...

    struts2 +sitemesh:实例学习

    Sitemesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大 量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。 它不仅仅能处理动态的...

Global site tag (gtag.js) - Google Analytics