首先是为什么整合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. TPO-23 C2 Advice on choosing courses

    第 1 段 1.Listen to a conversation between a student and his English professor. 请听一段学生与他的英文教授的对话. 第 2 ...

  2. 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)

    我使用思维导图做学习笔记,最终绘制了一张比较满意的思维导图,想要分享出去,但由于现在思维导图软件众多,成品文件格式差别蛮大,不利于传播和打开,所以需要转化为普通图片,但笔者使用的导图软件导出转化成的图 ...

  3. GIT rebase讲解

    对分支进行rebase 从master分支checkout出fork分支,并在master和fork上都进行了一些修改 现在fork分支想要及时的同步master分支上的修改,避免在已经失效的代码上继 ...

  4. NO.2:自学tensorflow之路------BP神经网络编程

    引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...

  5. easyui panel异步获取后台数据在前台显示

    我在使用easyui的时候,想做一个向下图所示的效果,这个panel的样式已经做好了,想从后台异步获取json数据,然后填入到文本框中,不知道哪位大神能给点指导?万分感谢! 放入表单中,使用form对 ...

  6. find 删除文件

    find 目录 -type f -name '*' -print0 | xargs -0 rm

  7. Jsp----注册登陆

    一.需求分析 目前99%的网站都会有用户的登陆注册界面(用户就是一切嘛).其需求可想而知. 二.设计过程及所查寻资料 通过寻找上课老师所给予的课件,搜寻相关内容:目前以获取相关有java web关于w ...

  8. MAX值-单元测试

    #include<iostream> using namespace std; int Largest(int list[], int length); // list[]:求最大值的函数 ...

  9. 《Spring2之站立会议8》

    <Spring2之站立会议8> 昨天,添加了登录界面: 今天,准备添加注册界面: 遇到的问题:过程中遇到了一些困难,不过还是解决了.

  10. 调研Android的开发环境的发展演变

    在 知道要做基于移动端的项目实践时,我就选定了Android,回来的时候查了很多相关的知识,很多人都在问开发安卓软件,使用eclipse还是用 Android studio?其实,也没有一个准确的答案 ...