Spring和Struts2集成

来源:互联网 发布:淘宝网禁止发布违背 编辑:程序博客网 时间:2024/06/07 02:36

推荐两篇博客:集成的大致思路大致都是如此那就是谁来创建Action, Struts来创建Action; Spring来创建Action,
1,Struts2和Spring集成合并
2,Spring和Struts2集成的两种方式


方式1:Action由Struts2框架负责创建;Service由Spring框架负责创建,提供了jar包:struts2-spring-plugin-2.1.8.1.jar。将这样两个框架就可以通过此jar包进行合并集成了。
Step 1:
在 web.xml文件中配置struts2和spring的两个关键类,目的是让在tomcat在启动时,就创建好Struts的中央控制器StrutsPrepareAndExecuteFilter 和 Spring 的配置文件初始化类ContextLoaderListener;
web.xml

<?xml version="1.0" encoding="UTF-8"?>      <web-app 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">          <!-- 用于指定Spring的配置文件路径 -->          <context-param>              <param-name>contextConfigLocation</param-name>              <param-value>classpath:applicationContext-*.xml</param-value>          </context-param>          <!-- 服务器启动时,通过监听器初始化Spring的配置环境               监听器,默认加载文件是:/WEB-INF/applicationContext.xml          -->          <listener>              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>          </listener>          <!-- 配置Struts2框架的核心调度器 -->          <filter>              <filter-name>struts2</filter-name>              <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>          </filter>          <filter-mapping>              <filter-name>struts2</filter-name>              <url-pattern>/*</url-pattern>          </filter-mapping>      </web-app>  

Step 2:
这样两者的各自环境就算搭建好了,那么如何进行两者的集成合并呢?这里Struts2为我们提供了jar包:struts2-spring-plugin-2.1.8.1.jar。我们需要将此jar包也引用到项目中。这样两个框架就可以通过此jar包进行合并集成了。
简单说一下这个jar包的作用吧:插件中提供了新的工厂类,覆盖了Struts2的原工厂类。新工厂类的工作原理:首先根据Action的完整类名,到Spring配置文件中查询bean标签的id是否存在一致的名称。如果有一致的说明,Action对象是由Spring负责创建,并有Spring进行装配组合对象之间的关系。
如果查找不到,会进行特殊的处理操作,再由Strtus2框架进行反射创建Action对象,并采用Strust2框架的自动装配功能来完成Action和Service对象的关联默认是根据name进行查找的,当然我们也可以进行修改,例如改成以type类型进行查找的方式:

在struts.xml文件中指定指定以type的方式组合action和service的关系

<constant name="struts.objectFactory.spring.autoWire"value="type"/>

方案二,Struts2负责流程,Spring负责对象的创建,Action和Service都由Spring框架负责创建。
这是常用的集成合并方案。步骤和上边的基本上一样,都是导入响应的jar包,拷入响应的配置文件,web.xml文件的写法也一样。
struts2.xml的写法:

 <struts> <!--写法基本一样但是注意class的值,这里没有写真正路径,为了是在Spring中根据此值进行查找-->      <package name="example" namespace="/user" extends="struts-default">          <action name="login" class="loginAction" method="login">              <result name="success" type="redirect">/success.jsp</result>              <result name="login" type="redirect">/login.jsp</result>          </action>      </package>          </struts>  

applicatinContext.xml的写法:
这里的id对应上边的class,这里的class才是真正的路径,采用了Spring的根据name自动装配的功能,当然也可以我们手动指定,这里需要注意的是,action需要多例创建,而Spring默认为单例创建的,所以需要制定scope=”prototype”

<bean id="loginAction" class="com.ljh.action.LoginAction" autowire="byName" scope="prototype"></bean>  <bean id="userService" class="com.ljh.service.UserService" ></bean>  

需要注意的是,为了完成Spring托管Struts Action,必须加入一个包,该包为:struts2-spring-plugin-2.2.1.jar,或者其他版本。如果系统中加入了该包,那么就不需要在Struts配置文件中加入配置了,该常量配置是指示Action的创建者由Struts变为Spring。为什么加入了该包以后就不需要加入的配置了呢?这是由于在包内定义了一个struts-plugin.xml的文件,该文件内容如下所示:

<struts>     <!—创建Action的类变为了StrutsSpringObjectFactory-->    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />    <!--  Make the Spring object factory the automatic default -->    <constant name="struts.objectFactory" value="spring" />    <constant name="struts.class.reloading.watchList" value="" />    <constant name="struts.class.reloading.acceptClasses" value="" />    <constant name="struts.class.reloading.reloadConfig" value="false" />    <package name="spring-default">        <interceptors>            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>            <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>        </interceptors>    </package>   </struts>
原创粉丝点击