首先是为什么整合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. Java多线程多个线程wait(),一个notify()唤醒,唤醒的顺序

    package thread; public class ThreadWN implements Runnable { public String name; public String getNam ...

  2. java学习(三)类、实例

    类 public class Dog{ String breed; int age; String color; void barking(){ } void hungry(){ } void sle ...

  3. Python 之Memcache中间件

    一.引子 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,它通过在内存中缓存数据和减少读取数据库的次数,从而提高动态数据库驱动网站的速度.Memcache ...

  4. UnityEditor扩展-Shader浏览器

    1. 用途 用于浏览项目所有Shader被使用的情况 2. 界面说明 Ignore Directory:添加不搜索的文件夹,不添加默认搜索全部 Find按钮:开始搜索 Used Shaders:已被使 ...

  5. 如何在多机架(rack)配置环境中部署cassandra节点

    cassandra节点上数据的分布和存储是由系统自动完成的.除了我们要设计好partition key之外,在多机架(rack)配置环境中部署cassandra节点,也需要考虑cassandra分布数 ...

  6. dom学习要点

    Dom操作 1.文本内容操作 - innerText:操作文本 - innerHtml:操作全内容 //innerText标签: <div id='i2' ><a>土味程序员& ...

  7. impala 使用记录

    在命令行里面直接输入类似下面的语句,就可以执行impala sql语句. impala-shell -q "select * from xxxc limit 10;" 当用pyth ...

  8. Django_WSGIRequest对象

    WSGIRequest对象 Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数.这个参数就是dja ...

  9. Django_rest_framework_组件(authentication、permission、throttle)

    认证组件 说明 from rest_framework.authentication import BaseAuthentication class TestAuthentication(BaseAu ...

  10. PHP使用Sublime Text3技巧

    1 下载安装 2 安装Package Control 3 安装插件 4 快捷键 5 项目管理 6 设置代理 PHP开发时,笔者用过EditPlus3.Nodpad++.Vi.Vim和Netbeans, ...