Spring框架是一个非常优秀的轻量级Java EE容器,Spring框架是整个轻量级Java EE框架的核心。大部分的Java EE应用,都会考虑使用Spring容器管理应用中的组件,从而保证各组件之间的低耦合。Struts2框架只是一个MVC框架,Web层的解决方案。其通过一种”可插拔式“的插件,实现了与Spring框架的整合。

Struts2提供了两种基本的整合策略,其中一种策略是将Action实例交给Spring容器来负责生成、管理,通过这种方式,可以充分利用Spring容器的IoC特性,提供最好的解耦;另外一种策略是利用Spring插件的自动装配方式,当Spring插件创建Action实例后,立即将Spring容器中对应的业务逻辑组件注入Action实例。通过这两种方式,即可让Struts2的Action访问到Spring容器中的Bean。整合的关键是让Struts2的Action可以访问Spring容器中的业务逻辑组件,不管通过上述的两种方式的哪种,都可实现让Action访问Spring容器中业务逻辑组件的目的。

一、Struts2插件

Struts2的插件是一个JAR文件,这个文件可以用于扩展、改变或者添加Struts2的功能,只需要复制该jar文件到web应用中即可。

Struts2的插件Jar文件都必须包含一个名为struts-plugin.xml的配置文件,其余普通的struts.xml文件内容完全相同。struts2插件的加载顺序随机,但是配置文件确实按照 struts-default.xml、struts-plugin.xml、struts.xml顺序加载。 从系统实现的角度来看,如果我们需要扩展struts2的功能,可以通过提供新的拦截器、新的Bean实例来实现;如果从系统结构的角度来看,如果我们需要扩展struts2的功能,则通过提供新的插件即可。

spring和struts2的整合,必须安装struts2的spring插件,只需将struts2-spring-plugin-x.x.x.x.jar文件复制到Web应用的WEB-INF/lib路径下即可。一旦安装了spring插件,我们便可以通过spring控制所有的action,也可在struts2创建之后,使用spring注入进去。为了使用spring容器,我们需要先初始化spring容器,spring提供了ContextLoaderListener类,该类可以作为Web应用的Listener使用,它会在Web应用启动自动在WEB-INF路径下查找applicationContext.xml配置文件,并且根据此文件创建Spring容器。如果我们使用别的配置文件,或者配置文件不止这一个,可以使用参数contextConfigLocation指定,如下:

<context-param>

   	 <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/xxxDao.xml,/WEB-INF/applicationContext.xml</param-value>
     </context-param>
     <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

下面我们考虑让spring容器来管理应用中的控制器,struts2的核心控制器首先拦截到用户请求,然后将请求转发给对应的Action处理,这个过程是固定的。但实际上,Action实例是struts2容器产生的,我们需要用spring容器来产生它,充分利用spring的ioc特性。spring插件提供了一种为Action,当我们在struts.xml文件中陪孩子action时,指定的class,指向spring容器中的BeanID,而Struts2的该action只是一个摆设,spring容器中才是真正的控制器。

如下,struts2.xml中配置:

<struts>

        <package name="demo" extends="struts-default">
            <action name=login" class="loginAction">
                    <result name="error">/WEB-INF/jsp/error.jsp</result>
                    <result>/WEB-INF/jsp/welcome.jsp</result>
            </action>
        </package>

</struts>

这个loginAction类不是实际的处理类,我们需要在applicationContext.xml中配置该Bean,如下:

<bean id="loginAction" class="com.demo.struts2.action.LoginAction" scope="prototype" />

如果使用了其他的bean,还可以在该bean进行注入。这样便实现了spring容器产生action,但是这样显然action配置比较臃肿,代码可读性降低。

二、使用自动装配

这种策略下,action还是有spring插件创建,只是使用了spring的自动装配策略而已。如果不指定装配策略,默认按name自动装配。spring插件的自动装配策略通过struts.objectFactory.spring.autoWire常量指定,该常量可以有name、type、auto、constructor几种。

修改struts.xml的配置如下:

<struts>

        <package name="demo" extends="struts-default">
            <action name=login" class="com.demo.struts2.action.LoginAction">
                    <result name="error">/WEB-INF/jsp/error.jsp</result>
                    <result>/WEB-INF/jsp/welcome.jsp</result>
            </action>
        </package>

</struts>

可以看出其实和不整合spring好像没有区别,配置action时一样需要指定action的实现类,此时有一点不同的是action实现类中的依赖对象或者说业务逻辑对象,我们可以通过spring注入进去。

Spring与Struts整合的更多相关文章

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

    spring和struts2的整合 1:配置Web.xml文件 <filter> <filter-name>struts2</filter-name> <fi ...

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

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

  3. spring和struts整合

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

  4. spring、struts整合

    package com.hanqi.test; public class JISQ { public double add(double a,double b) { return (a+b); } } ...

  5. spring 和 struts 整合遇到的问题(学习中)

    一大早就报错 org.hibernate.TransactionException: Transaction not successfully started at org.hibernate.eng ...

  6. jbpm与spring hibernate struts整合

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  7. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  8. Spring与Struts框架整合

    Spring与Struts框架整合 Struts,用Action处理请求 Hibernate,操作数据库 Spring,负责对象创建 Spring与Struts框架整合的关键点在与:让Struts框架 ...

  9. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

随机推荐

  1. Machine Learning & Data Mining 资料整合

    机器学习常见算法分类汇总 | 码农网 数据挖掘十大经典算法 | CSDN博客 (内含十个算法具体介绍) 支持向量机通俗导论(理解 SVM 的三层境界)| CSDN博客 (强烈推荐关注博主) 教你如何迅 ...

  2. select XXX into 和 Insert into XXX select

    检索一个表中的部分行存到另一张表中. 一 .另外的那张表没有新建的时候,使用 select XXX into,创建的表与原表有相同的列名和类型: select * into Departments_C ...

  3. HDU-4750 Count The Pairs 最小生成树,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:Q个询问t,求在一个无向图上有多少对点(i,j)满足 i 到 j 的所有路径上的最长边的最 ...

  4. 现代程序设计 homework-04

    题目要求: 第四次作业,构造一个方阵将指定单词填入 stage 1:每个单词只出现1次,且八个方向各至少有两个单词 stage 2:矩阵长宽相等 stage 3:方阵的四个角都要参与单词的构建 算法思 ...

  5. 【C语言】-一维数组

    数组: 数组是一系列相同类型的有序数据的集合,数组中的每一个元素都是同一个数据类型,所有元素共用一个名字,用下标来区别数组中的每一个元素. C语言中,数组属于构造数据类型.一个数组中含有多个数组元素, ...

  6. C++ API设计

    <C++ API设计> 基本信息 作者: (美)Martin Reddy    译者: 刘晓娜 臧秀涛 林健 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153 ...

  7. [转]Freemarker数据类型转换

    转至:http://blog.sina.com.cn/s/blog_667ac0360102eaz8.html // 测试程序 package myTest; import java.io.Buffe ...

  8. 让人眼花缭乱的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0

    1.0的规范 http://web.resource.org/rss/1.0/spec 2.0的规范 http://cyber.law.harvard.edu/rss/rss.html 一个介绍什么是 ...

  9. Debug Tools

    .NET专用调试工具:MDBG .NET的死锁调试工具:ACorns.Debugging WinDBG+SOS(Windows平台下最强DeBug工具,是解决BUG的最后手段)

  10. 如何将std::string转int,double? (C/C++) (C) (template)

    http://www.cnblogs.com/oomusou/archive/2008/08/01/525647.html http://blog.sina.com.cn/s/blog_a843a88 ...