首先是为什么整合strut2和spring?

  struts2的action是由struts2自己创建出来的,它不受spring的委托,也不受spring的管理,所以无法进行自动注入;spring和struts的结合点就在于struts的action不能直接注入service,都是通过自己来进行创建的;

  在整合spring和struts2的时候需要使用一个apache提供的第三方的插件包struts2-spring-plugin,版本自由决定,如果因为版本不兼容的问题造成项目无法启动可以考虑使用最新版本的插件包,一般是向下进行兼容的;

  非注解的整合有两种方式:第一种是让spring管理控制器,第二种是自动装配;

1、让spring管理控制器

  这种方式将action的实例交给spring来进行创建和管理,通过这种方式能够充分的提现spring的IOC特性;但是这种方式在整合的时候需要注意,spring中bean的scope属性默认问sington(单例),必须修改为prototype;

示例:

1、通过maven的方式下载struts、spring以及插件包

     <!-- spring所需jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- struts2所需jar包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.34</version>
</dependency>
<!-- struts2和spring整合所需jar包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>

2、在web.xml中配置spring的监听器和struts的过滤器

 <!-- 指定spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext.xml</param-value>
</context-param>
<!-- spring启动 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 配置struts2过滤器 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3、创建action

public class LoginAction {
private LoginService loginService;
public LoginService getLoginService() {
return loginService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
public String execute(){
loginService.sys();
return "success";
}
}

4、在applicationContext.xml中配置bean的创建

   <!-- 创建一个service实例 -->
<bean id="loginService" class="com.lcg.service.LoginService"></bean>
<!--
创建一个action实例,因为scope默认的为sington,此处需要修改为prototype
为其注入service实例对象
-->
<bean id="loginAction" class="com.lcg.action.LoginAction" scope="prototype">
<property name="loginService" ref="loginService"></property>
</bean>

5、在struts.xml中配置action的信息

  <package name="basepkg" extends="struts-default" namespace="/">
    <!--class为spring创建的bean的ID属性的值-->
<action name="login" class="loginAction" method="execute">
<result name="success">/index.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>

  缺点:这种方式的缺点是必须把action配置在spring当中,而且在struts.xml中还要生成一个伪action,这样子会导致配置文件比较臃肿;

2、自动装配

  这种方式的基本流程是这样的,这种情况的整合,action的创建还是由struts2来进行创建,创建后对象会去spring容器中寻找它成员变量对应的bean,默认的自动装配的粗略是按照名称来进行匹配;

优缺点:

优点:

 struts.xml文件是和未整合前是一致的,主要的变化是业务逻辑层的bean交由spring来进行管理;相对于第一种方式这种方式的好处就是简化配置文件;

缺点:

 如果采用默认的自动装配策略,action中的成员变量名要和spring中的bean的id名保持一致,且,代码的可读性较差;

配置自动装配策略:

    spring插件的自动装配可以通过struts.objectFactory.spring.autoWire  该常量可以接收如下值:

  name:根据属性名自动装配

  type:根据类型进行自动装配,如果有多个类型相同的bean就会抛出一个致命的异常,如果没有匹配的bean则什么都不会发生,属性不会被设置;

   auto:spring插件会自动检测根据什么方式进行自动装配

   constructor:同type类似,区别是根据constructor使用构造器来构造注入所需的值;

示例:

struts.xml文件保持不变,增加装配类型,默认根据名称进行装配

   <!-- 设置service的自动装配方式,默认为name,根据bean的id来进行装配 -->
<constant name="struts.objectFactory.spring.autoWire" value="type"></constant>
<package name="basepkg" extends="struts-default" namespace="/">
<action name="login" class="com.lcg.action.LoginAction" method="execute" >
<result name="success">/index.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>

applicationContext.xml

    <!-- 创建一个service实例 -->
<bean id="loginService" class="com.lcg.service.LoginService"></bean>

action

   private LoginService loginServices;
public LoginService getLoginServices() {
return loginServices;
}
public void setLoginServices(LoginService loginServices) {
this.loginServices = loginServices;
}
public String execute(){
loginServices.sys();
return "success";
}

3、使用注解的方式整合spring+struts2

第一步,开启spring注解扫描

第二步,定义action,并通过注解进行配置

@Controller:定义一个控制器类

@parentPackage:定义action的父包,一般为struts-default

@NameSpace:定义命名空间

@Scope:定义作用域

@Action:定义action的访问路径,和结果

@Autowired:自动装配

    

spring+struts整合的更多相关文章

  1. spring+hibernate+struts整合(1)

    spring+hibernate:整合 步骤1:引入类包 如下图:这里是所有的类包,为后面的struts整合考虑

  2. struts2,hibernate,spring整合笔记(4)--struts与spring的整合

    饭要一口一口吃,程序也要一步一步写, 很多看起来很复杂的东西最初都是很简单的 下面要整合struts和spring spring就是我们的管家,原来我们费事费神的问题统统扔给她就好了 先写一个测试方法 ...

  3. Struts+Spring+Hibernate整合

    这段笔记三两年前写的,一直因为一些琐事,或者搞忘记了,没有发.今天偶然翻出了它,就和大家一起分享下吧. 1.导入jar包 Struts的jar包: Spring的jar包: Hibernate的jar ...

  4. Struts、Hibernate和Spring的整合

    Spring整合Hibernate Spring以其开放性,能与大部分ORM框架良好的整合.这样Spring就能轻松地使用ORM. Spring提供了DAO支持,DA0组件是应用的持久层访问的重要组件 ...

  5. spring和struts整合

    整合准备:导入jar包 如果只是访问action,没有做数据库方面的操作的话 只需要导入下面的jar spring相关jar 以及struts相关jar包 整合过程: 用到了struts所以需要在we ...

  6. struts2 spring mybatis 整合(test)

    这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...

  7. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

  8. Spring与Struts2整合VS Spring与Spring MVC整合

    Spring与Struts2整合,struts.xml在src目录下 1.在web.xml配置监听器 web.xml <!-- 配置Spring的用于初始化ApplicationContext的 ...

  9. struts2+hibernate-jpa+Spring+maven 整合(1)

    1.0.0 struts2 与 spring 的整合. 1.1.0 新建maven工程 , 编写pom.xml ,这里只需要简单的添加 一个组件就够了: 在myeclipse 生成的pom.xml 添 ...

随机推荐

  1. MySQL与DevC++的连接问题

    0.引言 MySQL作为当前的一个主流的开源的关系型数据库,受到大家的广泛关注.DevC++也作为一个开源的简单的C++编辑器,有着比VS更简便更快捷的编译.但是目前网上,却很少有对 MySQL连接D ...

  2. svn树冲突的解决方法

    树冲突 就是开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行了移动.重命名.删除或者仅仅是修改时就会发生树冲突.有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来 ...

  3. RabbitMQ入门:Hello RabbitMQ 代码实例

    在之前的一篇博客RabbitMQ入门:认识并安装RabbitMQ(以Windows系统为例)中,我们安装了RabbitMQ并且对其也有的初步的认识,今天就来写个入门小例子来加深概念理解并了解代码怎么实 ...

  4. 402. Remove K Digits/738.Monotone Increasing Digits/321. Create Maximum Number

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  5. navicat连接mysql出现1251错误

    刚刚安装热乎的navicat发现出现1251错误,原因不大清楚,找到一个解决办法: 将mysql的密码重新重置一遍: 1.打开命令行 ,进入mysql所在的目录,输入 mysql -uroot -p ...

  6. 详细介绍redis的集群功能,带你了解真正意义上的分布式

    Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset). ...

  7. tf导出pb文件,以及如何使用pb文件

    先罗列出来代码,有时间再解释 from tensorflow.python.framework import graph_util import tensorflow as tf def export ...

  8. PHP 包含文件

    1.require test123.php <?php $a=1; 运行文件: <?php require('test123.php'); echo 'Hello!'; echo '< ...

  9. 微软职位内部推荐-Software Engineer II-Senior Software Engineer for Satori

    微软近期Open的职位: Title: Software Engineer II-Senior Software Engineer for Satori, STC Location: Beijing ...

  10. 遇到执行SQL 的参数最大个数

    报错: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.此 RPC 请求中提供了过多的参数.最多应为 2100. 现象是: SQL 执行的参数过多,超过了 最大值 :2100 个. ...