Struts2前身是WebWork,核心并没有改变,其实就是把WebWork改名为struts2,与Struts1一点关系没有。

Struts2中通过ObjectFactory接口实现创建及获取Action实例,类似于Spring的IoC容器,所以Action实例可以由ObjectFactory实现来管理,因此集成Spring的关键点就是如何创建ObjectFactory实现来从Spring容器中获取相应的Action Bean。

Struts2提供一个默认的ObjectFactory接口实现StrutsSpringObjectFactory,该类用于根据Struts2配置文件中相应Bean信息从Spring 容器中获取相应的Action。

因此Struts2.x与Spring集成需要使用StrutsSpringObjectFactory类作为中介者。

接下来让我们首先让我们准备Struts2x所需要的jar

准备Struts2.x需要的jar包,到Struts官网http://struts.apache.org/下载struts-2.2.1.1版本,拷贝如下jar包到项目的lib目录下并添加到类路径:

 

lib\struts2-core-2.2.1.1.jar              //核心struts2包

lib\xwork-core-2.2.1.1.jar              //命令框架包,独立于Web环境,为Struts2

//提供核心功能的支持包

lib\freemarker-2.3.16.jar               //提供模板化UI标签及视图技术支持

lib\ognl-3.0.jar                       //对象图导航工具包,类似于SpEL

lib\ struts2-spring-plugin-2.2.1.1.jar      //集成Spring的插件包

lib\commons-logging-1.0.4.jar          //日志记录组件包(已有)

lib\commons-fileupload-1.2.1.jar        //用于支持文件上传的包

10.3.2  使用ObjectFactory集成

1、Struts2.x的Action实现:

  1. package cn.javass.spring.chapter10.struts2x.action;
  2. import org.apache.struts2.ServletActionContext;
  3. import com.opensymphony.xwork2.ActionSupport;
  4. public class HelloWorldAction extends ActionSupport {
  5. private String message;
  6. @Override
  7. public String execute() throws Exception {
  8. ServletActionContext.getRequest().setAttribute("message", message);
  9. return "hello";
  10. }
  11. public void setMessage(String message) {//setter注入
  12. this.message = message;
  13. }
  14. }

2、JSP页面定义,使用Struts1x中定义的JSP页面“webapp/WEB-INF/jsp/hello.jsp”;

3、Spring一般配置文件定义(resources/chapter10/applicationContext-message.xml):

在此配置文件中定义我们使用的“message”Bean;

  1. <bean id="message" class="java.lang.String">
  2. <constructor-arg index="0" value="Hello Spring"/>
  3. </bean>

4、Spring Action 配置文件定义(resources/chapter10/hello-servlet.xml):

  1. <bean name="helloAction" class="cn.javass.spring.chapter10.struts2x.action.HelloWorldAction" scope="prototype">
  2. <property name="message" ref="message"/>
  3. </bean>

Struts2的Action在Spring中配置,而且应该是prototype,因为Struts2的Action是有状态的,定义在Spring中,那Struts如何找到该Action呢?

5、struts2配置文件定义(resources/chapter10/struts2x/struts.xml):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
  7. <constant name="struts.devMode" value="true"/>
  8. <package name="default" extends="struts-default">
  9. <action name="hello" class="helloAction">
  10. <result name="hello" >/WEB-INF/jsp/hello.jsp</result>
  11. </action>
  12. </package>
  13. </struts>
  • struts.objectFactory通过在Struts配置文件中使用常量属性struts.objectFactory来定义Struts将要使用的ObjectFactory实现,此处因为需要从Spring容器中获取Action对象,因此需要使用StrutsSpringObjectFactory来集成Spring;
  • <action name="hello" class="helloAction">:StrutsSpringObjectFactory对象工厂将根据<action>标签的class属性去Spring容器中查找同名的Action Bean;即本例中将到Spring容器中查找名为helloAction的Bean。

6、web.xml部署描述符文件定义(webapp/WEB-INF/web.xml):

6.1、由于Struts2只能使用通用配置,因此需要在通用配置中加入Spring Action配置文件(chapter10/struts2x/struts2x-servlet.xml):

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>
  4. classpath:chapter10/applicationContext-message.xml,
  5. classpath:chapter10/struts2x/struts2x-servlet.xml
  6. </param-value>
  7. </context-param>

Struts2只能在通用配置中指定所有Spring配置文件,并没有如Struts1自己指定Spring配置文件的实现。

6.2、Strut2前端控制器定义,在web.xml中添加如下配置:

  1. <!-- Struts2.x前端控制器配置开始   -->
  2. <filter>
  3. <filter-name>struts2x</filter-name>
  4. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  5. <init-param>
  6. <param-name>config</param-name>
  7. <param-value>
  8. struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml
  9. </param-value>
  10. </init-param>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>struts2x</filter-name>
  14. <url-pattern>*.action</url-pattern>
  15. </filter-mapping>
  16. <!-- Struts2.x前端控制器配置结束   -->
  • FilterDispatcherStruts2前端控制器为FilterDispatcher,是Filter实现,不是Servlet;
  • config通过初始化参数config指定配置文件为struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml;如果不知道该参数则默认加载struts-default.xml,struts-plugin.xml,struts.xml(位于webapp/WEB-INF/classes下);显示指定时需要将struts-default.xml,struts-plugin.xml也添加上。
  • *.action将拦截以“.action”结尾的HTTP请求;
  • struts2xFilterDispatcher前端控制器的名字为struts2x,因此相应的Spring配置文件名为struts2x-servlet.xml。

7、执行测试,在Web浏览器中输入http://localhost:8080/hello.action可以看到“Hello Spring”信息说明Struts2集成成功。

 

集成Strut2也是非常简单,在此我们总结一下吧:

  • 配置文件位置:

Struts配置文件默认加载“struts-default.xml,struts-plugin.xml, struts.xml”,其中struts-default.xml和struts-plugin.xml是Struts自带的,而struts.xml是我们指定的,默认位于webapp/WEB-INF/classes下;

如果需要将配置文件放到其他位置,需要在web.xml的<filter>标签下,使用初始化参数config指定,如“struts-default.xml,struts-plugin.xml,chapter10/struts2x/struts.xml”,其中“struts-default.xml和struts-plugin.xml”是不可省略的,默认相对路径是类路径。

  • 集成关键ObjectFactory在Struts配置文件或属性文件中使用如下配置知道使用StrutsSpringObjectFactory来获取Action实例:

在struts.xml中指定:

  1. <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>

或在struts.properties文件(webapp/WEB-INF/classes/)中:

java代码:

  1. struts.objectFactory=org.apache.struts2.spring.StrutsSpringObjectFactory
  • 集成关键Action定义:

StrutsSpringObjectFactory将根据Struts2配置文件中的<action class=””>标签的classes属性名字去到Spring配置文件中查找同名的Bean定义,这也是集成的关键。

 

  • Spring配置文件中Action定义:由于Struts2的Action是有状态的,因此应该将Bean定义为prototype。

 

如图10-5,Sturt2与Spring集成的关键就是StrutsSpringObjectFactory,注意图只是说明Struts与Spring如何通过中介者StrutsSpringObjectFactory来实现集成,不能代表实际的类交互。

spring集成struts2的更多相关文章

  1. Spring集成Struts、Hibernate----三大框架SSH(Spring、Struts和hibernate)

    Spring 框架可以完成业务层的设计任务,Struts框架可以将表示层和业务层分离,而Hibernate框架可以提供灵活的持久层支持.下面介绍三大框架的集成环境: 1.配置Struts2. I.导入 ...

  2. struts2与spring集成时action的class属性值意义

    struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建(依赖注入).这导致在两种情况下struts.xml配置文件的略微差异. ...

  3. Struts2+Spring集成合并

    前边单独总结了Struts2,Spring和Ibaits框架了,那么怎么结合使用呢?这次先来看一下Sturts2和Spring的集成合并.其实挺简单的,就是导入各自的jar包以及连接彼此的jar包,分 ...

  4. 集成Struts2+Spring+Hibernate_两种方案

    集成Struts2+Spring+Hibernate 第一种方案:让Spring创建Struts2的Action,不让Spring完全管理Struts2的Action      Struts2 Act ...

  5. 通过struts2-spring-plugin集成Struts2和Spring,报错:ClassNotFound:*Interceptor.......

    集成Struts2和Spring的时候,出现错误,ClassNotFound: *interceptor,之所以是*interceptor是因为报了好多个这样的错误,而且类名都不一样. 集成方法是通过 ...

  6. Spring与Struts2集成开发

    Struts2和Spring都是不错的开源框架,Spring与Struts2集成开发,把二者结合在一起使用,开发效果更佳,效率杠杠的.下面介绍一下如何将Spring与Struts2集成在一起开发.分七 ...

  7. Struts2和Spring集成

    Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务.所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东 ...

  8. Spring,Struts2,MyBatis,Activiti,Maven,H2,Tomcat集成(四)——Activiti集成

    1.添加Activiti Maven依赖: <!-- ==============================activiti=========================== --&g ...

  9. Spring、Struts2+Spring+Hibernate整合步骤

    所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...

随机推荐

  1. php 利用迭代器遍历文件夹

    1.遍历文件夹 scandir 2.原生的迭代器Iterrate $scan_dir = "txtDir"; //下面会遍历txtDir 下面所有字文件夹中的文件哦 $dir_it ...

  2. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  3. 使用JSON.parse()转化成json对象需要注意的地方

    http://blog.csdn.net/u011277123/article/details/53055479 有三种方法: var str = '{"name":"小 ...

  4. Python3 len()方法

    Python3 len()方法  Python3 字符串 描述 Python len() 方法返回对象(字符.列表.元组等)长度或项目个数. 语法 len()方法语法: len( s ) 参数 s - ...

  5. 学习C++50条忠告

    1.把C++当成一门新的语言学习: 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programming Language ...

  6. SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  7. TZOJ 4435 n皇后问题(回溯)

    描述 在 n×n 的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后(任两个皇后都不能处于同一条横行.纵行或斜线上) 输入 输入有多组(直到-1结束) 每组一行 一个整数 n(0& ...

  8. 不同的路径12障碍物 · Unique Paths12

    [抄题]: 有一个机器人的位于一个 m × n 个网格左上角. 机器人每一时刻只能向下或者向右移动一步.机器人试图达到网格的右下角. 问有多少条不同的路径? [思维问题]: 以为要用count来计数: ...

  9. 删除链表中的重复元素:不留&留一个&删除一个

    不留: [抄题]: 给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素. [思维问题]: 给出 1->2->3->3->4->4->5->nul ...

  10. runtime - 2 - 使用私有方法

    1. 创建 一个person类, 有对象方法, 私有化方法 2. 在h 文件里面 - (void)eat; //- (void)run:(NSInteger)metre; 3. 在m文件里面 -(vo ...