struts2 整合spring及 由spring治理struts的Action实例

    技术2026-01-01  0

    struts2 整合spring

    其他方式不说,仅说这一种方式,我个人觉得这种方式很方便,struts2 的action 的配置无需变动,也不用放到spring的xml中去管理action,action依然由struts控制管理,service层以下的东西由spring来管理。首先用Listener的方式来启动spring:在web.xml中加入listener:<context-param>        <param-name>contextConfigLocation</param-name>        <param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener></listener>ContextLoaderListener 会使用contextConfigLocation参数,启动加载spring配置,建立WebApplicationContext,并将其保存在ServletContext中,见spring中的源码:------------------------------------------------------.......   this.context = createWebApplicationContext(servletContext, parent);   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);........------------------------------------------------------然后spring就启动好了,那么现在就是把spring整合到struts中来,需要做的就是在struts的配置文件struts.properties  中加入struts.objectFactory 和struts.objectFactory.spring.autoWire属性。(当然这些属性也可以不用struts.properties,可以写在struts.xml配置文件中,使用: <constant name="struts.objectFactory" value="spring"/><constant name="struts.objectFactory.spring.autoWire" value="name"/>)文件struts.properties:struts.objectFactory=springstruts.objectFactory.spring.autoWire=name...................OK, action的配置不用理会spring,自己配置即可,现在需要spring做的就是把service业务对象注入到struts的action中。要做到这样仅需做以下步骤即可:在action中声明service业务对象属性,如:private UserService userService;注意,必须为userService提供setter:private UserService setUserService(UserService userService){            this.userService=userService;}然后在spring的配置文件applicationContext.mxl中配置好UserService的bean。注意其id必须和action中的UserService属性的属性名一样:...<bean id="userService" class="com.yourcompany.service.impl.UserServiceImpl"></bean>...注意这里UserService 是接口,其实现类是: UserServiceImpl。到此,简单的测试应用就可以正常工作了,web容器把控制权交给struts的控制器 ActionServlet后,ActionServlet会根据struts的配置信息获取到一个Action,然后ActionServlet 会使用spring来注入 Action 中对应的属性根据属性名。另外如果你有特别需求,需要获取到 spring的ApplicationContext上下文,并通过它来获取一些bean的话,可以这样获取: WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext) 来获取。

     

    由spring治理struts的Action实例

     action 自己管理生命周期 。当指定struts.objectFactory为spring时,struts2框架就会把bean转发给spring来创建,装配,注入。但是bean创建完成之后,还是由struts容器来治理其生命周期。配置方式:

    struts.xml中:

    xml代码constantname="struts.objectFactory"value="spring"/

     

    struts.properties中:

     

    java代码struts.objectFactory=spring通常情况下,这样子就够了,然后在struts的action-mapping配置文件中,如下:

     

    xml代码actionname="user"class="com.myapp.admin.web.action.user.UserAction"/action

     

    即可,假如在Action中有依靠于其它的BEAN,也会被自动注入进来。这时候,Action实例是以prototype方式创建的,SPRING会为每个请求创建一个ACTION的实例。

     

    spring 管理其生命周期。在某些时候,你可能希望不仅仅让SPRING创建和装配Action对象,还希望让SPRING完全治理这些对象,如希望使用AOP或者希望使用acegi时。这时候,只需要在spring的配置文件中定义这些action即可。如在applicationContext.xml文件中:

    xml代码beanid="user"class="com.myapp.web.action.user.UserAction"/

     

    然后在action-mapping中,指定即可。

     

    需要注重的一个地方:Spring中的缺省作用域是Singleton作用域。而往往Action属于有状态的bean,应该使用prototype作用域。beanid="user"singleton="false"/假如忽略这个细节,在我们方便实用set,get方法处理数据的时候,可能会有线程安全上的风险。

     

    最新回复(0)