spring+struts整合
首先是为什么整合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整合的更多相关文章
- spring+hibernate+struts整合(1)
spring+hibernate:整合 步骤1:引入类包 如下图:这里是所有的类包,为后面的struts整合考虑
- struts2,hibernate,spring整合笔记(4)--struts与spring的整合
饭要一口一口吃,程序也要一步一步写, 很多看起来很复杂的东西最初都是很简单的 下面要整合struts和spring spring就是我们的管家,原来我们费事费神的问题统统扔给她就好了 先写一个测试方法 ...
- Struts+Spring+Hibernate整合
这段笔记三两年前写的,一直因为一些琐事,或者搞忘记了,没有发.今天偶然翻出了它,就和大家一起分享下吧. 1.导入jar包 Struts的jar包: Spring的jar包: Hibernate的jar ...
- Struts、Hibernate和Spring的整合
Spring整合Hibernate Spring以其开放性,能与大部分ORM框架良好的整合.这样Spring就能轻松地使用ORM. Spring提供了DAO支持,DA0组件是应用的持久层访问的重要组件 ...
- spring和struts整合
整合准备:导入jar包 如果只是访问action,没有做数据库方面的操作的话 只需要导入下面的jar spring相关jar 以及struts相关jar包 整合过程: 用到了struts所以需要在we ...
- struts2 spring mybatis 整合(test)
这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- Spring与Struts2整合VS Spring与Spring MVC整合
Spring与Struts2整合,struts.xml在src目录下 1.在web.xml配置监听器 web.xml <!-- 配置Spring的用于初始化ApplicationContext的 ...
- struts2+hibernate-jpa+Spring+maven 整合(1)
1.0.0 struts2 与 spring 的整合. 1.1.0 新建maven工程 , 编写pom.xml ,这里只需要简单的添加 一个组件就够了: 在myeclipse 生成的pom.xml 添 ...
随机推荐
- JS(JavaScript)插入节点的方法appendChild与insertBefore
首先 从定义来理解 这两个方法: appendChild() 方法:可向节点的子节点列表的末尾添加新的子节点.语法:appendChild(newchild) insertBefore() 方法:可在 ...
- renren_fast性能测试平台的安装部署
1.从GitHub下载源码: https://github.com/zyanycall/stressTestPlatform git clone https://github.com/zyanycal ...
- java查询几个菜单下的所有下级菜单
需求: 假如有几个一级菜单,一级菜单下面有几个二级菜单,二级菜单下又还有三级菜单.现在要求一级菜单里面的几个设置为无效,将不显示在前端.现在需要的是查询出一级菜单下面所有的菜单,包括二级,三级菜单 原 ...
- VGGnet——从TFrecords制作到网络训练
作为一个小白中的小白,多折腾总是有好处的,看了入门书和往上一些教程,很多TF的教程都是从MNIST数据集入手教小白入TF的大门,都是直接import MNIST,然后直接构建网络,定义loss和opt ...
- Windows下用HackRF和SDR#收听FM
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- SDN学习笔记
SDN 什么是SDN SDN是一种框架和思想,核心诉求是通过软件控制网络,实现业务的自动化部署,为方便软件来控制网络,希望控制面和转发面是分离的. 例如,传统的交换机内部,由交换机负责具体的网络流量往 ...
- (xampp)lampp 下配置https(ssl)自签双向认证以后 apache无法启动解决方案
自签CA一般是没有应用场景的,因为需要客户端浏览器导入证书才能访问 但是在某些需要内部使用的场景下,确实是一个解决方案 但是在lampp配置了双向认证以后发现 原来自带的管理命令 lampp star ...
- Kubernetes探索学习003--关于Kubernetes的Pod
关于Pod 关于Pod我们要慢慢去体会去接受它去使用它,尤其是运维人员这块需要从逻辑上形成认识,首先理解Pod是Kubernetes项目的原子调度单位.为什么是Pod而不是单个DockerContai ...
- Python之并发编程-IO模型
目录 一.IO模型介绍二.阻塞IO(blocking IO)三.非阻塞IO(non-blocking IO)四.多路复用IO(IO multiplexing)五.异步IO(Asynchronous I ...
- 第九次psp例行报告
本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图