首先,来看看如何让Spring 来管理Action.
引入包struts2-spring-plugin-2.2.1.jar
配置 web.xml
<!-- 指定spring的配置文件,主要配置spring为随着服务器启动而自启动,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- 对Spring容器进行实例化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>*.action</url-pattern>
</filter-mapping>
在struts.xml中加入
<constant name="struts.objectFactory" value="spring" />
有两种整合方式:
(1) 把Action配置在beans.xml里,利用Spring初始化Action的bean:
将Struts的业务逻辑控制器类配置在Spring的配置文件中,Action中引用的业务类一并注入。
(这样的处理,必须将action类的scope配置成property)
Xml代码
<bean id="LoginAction" class="yaso.struts.action.LoginAction">
<property name="loginDao" ref="LoginDao"/>
</bean>
接着,在struts.xml或者等效的Struts2配置文件中配置Action时,指定<action>的class属性为Spring配置文件中相应bean的id或者name值。示例如下:
Xml代码
<action name=”LoginAction” class=”LoginAction”>
<result name=”success”>/index.jsp</result>
</action>
(2) 不需要在beans.xml里配置Action,利用Struts-Spring_Plugin插件自动初始化Action:
业务类在Spring配置文件中配置,Action不需要配置,Struts2的Action像没有整合Spring之前一样配置,<action>的class属性指定业务逻辑控制器类的全限定名。
Action中引用的业务类不需要自己去初始化,Struts2的Spring插件会使用bean的自动装配将业务类注入进来,其实Action也不是Struts2创建的,而是Struts2的Spring插件创建的。默认情况下,插件使用by name的方式装配,可以通过增加Struts2常量来修改匹配方式:设置方式为:struts.objectFactory.spring.autoWire = typeName,可选的装配参数如下:
name:相当于spring配置的autowrie="byName"(默认)
type:相当于spring配置的autowrie="byType"
auto:相当于spring 配置的autowrie="autodetect"
constructor: 相当于spring配置的autowrie="constructor"
OK,这里说了配置部分,但是,这里有一个问题, 就是Spring管理Action,如果按照第一方式,那么只要通过scope="property"来配置为每个请求创建一个Action实例。 那么第二种方式,我们并没有指定Action的作用域。
(好似也没有地方可配……),那么,这样的整合方式,Action的创建到底是单例还是多例的呢?
答案:也是每个请求一个实例.