注:通常我们的action都要继承ActionSupport,这里都默认继承了该类
参考资料:
http://struts.apache.org/release/2.2.x/docs/spring-plugin.html
http://struts.apache.org/release/2.2.x/docs/spring-and-struts-2.html
要想将struts2和spring整合起来,只需要引入 struts2-spring-plugin-x-x-x.jar 即可
然后打开jar包,发现里面有一个struts-plugin.xml的文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" /> <!-- 这里指定了struts2中的对象生成的方式交给spring来管理--> <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> <!--这里定义了给action装配属性的拦截器,作用是给那些由struts2生成的action装配他们所依赖的属性--> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> </interceptors> </package> </struts>
这个plugin 的三个功能:
- Allow Actions, Interceptors, and Results to be created by Spring
- Struts-created objects can be autowired by Spring after creation
- Provides two interceptors that autowire actions, if not using the Spring ObjectFactory
第一:允许spring来控制Actions, Interceptors, and Results 的创建
第二: 那些由struts2 自身创建的对象在创建之后,他们所依赖的属性由spring来装配
第三:对于那些struts2自身创建的action,spring提供了两个拦截器来为他们装配属性
下面通过例子来详细的理解一下:
struts.xml 的内容为:
<action name="edit" class="com.tch.test.temp.test.EditAction" method="input"> <result name="input">/edit.jsp</result> </action>
假如我们的action里面有这样一个方法 setEditService(EditService editService):
package com.tch.test.temp.test; import com.opensymphony.xwork2.ActionSupport; public class EditAction extends ActionSupport { private static final long serialVersionUID = 1L; private EditService editService; public void setEditService(EditService editService) { this.editService = editService; } public String input(){ return SUCCESS; } }
其中spring容器管理着 EditServiceImpl 对象(注意,这里的action对象没有被spring容器管理):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="editService" class="org.apache.struts.edit.service.EditServiceImpl" /> </beans>
这种情况下,我们的action仍旧是被struts2 容器所创建的,但是它所依赖的 editService 属性,则是由spring来生成并负责注入的。
参考 http://struts.apache.org/release/2.2.x/docs/spring-and-struts-2.html 里面的:
(Using the above methodology, the Struts 2 framework will still manage the creation of the ActionSupport class. If you prefer you can configure the application so that Spring will create the ActionSupport class also. To support this technique you need to add a bean node to the Spring configuration file for the ActionSupport class.)
为什么是struts容器负责创建我们的action呢,这是因为action创建的时候,首先会去查看spring配置文件里面是否有id属性和struts配置文件中的class属性一致的对象,
如果有,则说明该对象已经由spring容器创建,struts就不会再自己创建了,如果发现spring容器没有创建,那么,struts容器就会自己创建该action,所以,
上面就是首先查看spring里面有没有id属性等于 struts.xml里面的class属性的对象(com.tch.test.temp.test.EditAction),最后发现没有,所以struts就自己创建该对象啦
好的,下面我们修改一下:
我们把spring配置文件改成这个样子:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="editService" class="org.apache.struts.edit.service.EditServiceImpl" /> <bean id="editAction" class="org.apache.struts.edit.action.EditAction" > <property name="editService" ref="editService" /> </bean> </beans>
把struts.xml 文件改成这样:
<action name="edit" class="editAction" method="input"> <result name="input">/edit.jsp</result> </action>
注意,struts.xml 这里的class属性是editAction, spring配置文件中也存在这样一个id是editAction的对象,并且类型一样
这个时候,struts会发现spring以及创建了这样的一个action,自己就不会在创建了,这样就实现了把action也交给spring来管理的目的。
当然,这两张做法都是可以的,没有那个是最好的,实际工作中也都有使用
上面的内容是在阅读了http://struts.apache.org/release/2.2.x/docs/spring-and-struts-2.html 之后的一点收获,睡觉前记录一下
也算是解决了之前自己的一点小疑惑,之前工作使用的是struts创建action,没有交给spring管理,所以以前一直奇怪,为什么struts创建的action可以被spring来注入它所依赖的属性。
现在明白了,是因为这个plugin里面提供了一个专门负责做这个装配工作的拦截器
最后需要注意的是如果将action交给spring管理,要将action设为非单例的,在xml中通过<bean id="bar" class="com.my.BarClass" singleton="false"/>来设置,
如果用注解的话,通过@Scope("prototype")来设置即可
相关推荐
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各司其职,共同构建了一个高效、灵活的后端架构。在这个"Struts2+Spring+Hibernate例子"中,开发者提供了一个完整的示例,旨在展示这三个框架如何协同...
2. **易于集成**:Struts 2可以很好地与其他Java EE技术栈集成,如Spring、Hibernate等,使得开发者能够构建出更加健壮的应用系统。 3. **强大的拦截器机制**:通过内置和自定义的拦截器,Struts 2能够高效地处理...
2. **与Hibernate和Spring的集成**:虽然Struts2可以独立运行,但它通常与Hibernate(数据持久化框架)和Spring(企业级应用框架)结合使用,共同构建企业级Web应用。Struts2与这些框架的集成可以实现数据访问、业务...
第九章可能讲解Struts2与其他框架的集成,如Spring、Hibernate等,以及如何构建完整的MVC架构。 最后,文档可能包含了一些实战示例,引导读者从零开始搭建一个完整的Struts2项目,通过实际操作加深对理论知识的理解...
第5章可能涉及Spring的IoC和AOP特性,以及如何在Struts 2中集成Spring。第6章和第7章可能重点讨论Hibernate的使用,包括实体类的定义、映射文件的配置、查询API的使用,以及与Spring的整合,如事务管理。 光盘说明....
6. **集成与扩展**:探讨Struts 2与其他框架(如Spring、Hibernate)的集成,以及如何自定义插件和扩展Struts 2的功能。 7. **最佳实践**:提供在实际开发中的一些最佳实践和注意事项,帮助开发者避免常见错误,...
7. **Struts2与其他框架集成**:由于标签中提到了SSH和Spring,教程可能会讲解如何结合Hibernate进行持久化操作,以及如何通过Spring插件实现依赖注入和事务管理。 "打开方式.htm"可能是一个网页,提供了如何阅读和...
Spring 还集成了其他许多框架,如 Struts 和 Hibernate,从而形成了一个强大的开发平台。 ##### 1.3 Hibernate Hibernate 是一个面向 Java 的 ORM(Object-Relational Mapping,对象关系映射)框架,它简化了持久...
Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(Model-View-Controller)架构的Web...通过深入研究这个例子,开发者能够建立起对MVC模式和Struts2框架的整体认识,为进一步学习和实践打下坚实的基础。
- **章节概述**:本章讨论了如何将Struts2与其他流行框架如Spring和Hibernate/JPA进行集成,以实现更加强大的功能。这有助于开发者构建更加健壮和可扩展的应用程序。 - **关键知识点**: - Spring和Hibernate/JPA...
Struts2并不直接处理事务,但可以通过与Spring框架集成来实现事务控制。 Spring2.5作为一款强大的轻量级框架,提供了全面的事务管理功能,支持编程式和声明式事务管理。编程式事务管理允许开发者在代码中显式地开始...
2. **依赖注入(DI)**:通过Struts2和Spring的集成,了解如何利用DI来管理对象的生命周期和依赖关系。 3. **AOP(面向切面编程)**:拦截器是如何实现AOP的,以及AOP在实际应用中的价值。 4. **OGNL表达式**:...
例如,Struts2与Spring集成,可以方便地管理Bean,实现依赖注入;Struts2的Tiles插件则用于页面布局,使得视图设计更加模块化。书中会介绍如何使用这些插件,以及如何自定义插件来满足特定需求。 对于错误处理和...
Spring还提供了与Struts等其他框架的集成方案,形成了强大的Spring生态系统。 【Hibernate】是一个持久化框架,它将对象关系映射(ORM)技术引入Java,使得开发者能以面向对象的方式操作数据库,减少了与SQL的直接...
此外,了解并学习Struts2与其他框架(如Hibernate、Spring)的集成,可以使你的Web应用更具健壮性和可维护性。 九、总结 Struts2是一个强大且成熟的Java Web框架,通过本文的介绍,你应该对Struts2有了初步的认识。...
7. ** strut2 框架集成**:Struts2可以方便地与Spring、Hibernate等其他框架集成,实现更复杂的业务逻辑和数据持久化。 8. **插件和扩展**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin提供了与Dojo ...
为了学习和理解这个系统,你需要对Java EE、Struts、Hibernate和Spring有基本的了解,熟悉MVC模式,掌握数据库设计和SQL操作,同时对Web开发的基本原理有所认识。通过研究这个示例,你可以深入了解这些技术在实际...