Spring和Struts整合的价值在于将Struts使用的BO或DAO 乃至Action交给Spring管理,从而充分利用Spring强大的IoC和AOP 特性。

无论使用哪种方式整合,都需要为 Struts装载 Spring 应用上下文环境。有以下三种方式:

1) 在struts-config.xml中使用Struts Plugin

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> 
<set-property property="contextConfigLocation"    
   value="/WEB-INF/classes/applicationContext.xml,/WEB-INF/action-servlet.xml"/> 
</plug-in>
2) 在web.xml中使用ContextLoaderListener

<context-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 
</context-param> 
<listener> 
      <listener-class> 
           org.springframework.web.context.ContextLoaderListener 
      </listener-class> 
</listener>
3) 在web.xml中使用ContextLoaderServlet

<context-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 
</context-param> 
<servlet> 
     <servlet-name>SpringContextServlet</servlet-name> 
     <servlet-class> 
         org.springframework.web.context.ContextLoaderServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
</servlet>

(org.springframework.web.context.ContextLoaderServlet 在spring3中已被删除)
注意:

用Struts PlugIn的方式加载Spring配置文件有可能导致DWR无法取得Spring中定义的bean,因为DWR有可能先于Struts被访问使用,而此时Struts配置文件还未加载!

因此,在Spring、Struts和DWR 集成时,应该在web.xml中通过ContextLoaderLisenter或ContextLoaderServlet加载Spring配置文件。

最佳实践是使用Struts PlugIn的方式加载Struts Action配置文件/WEB-INF/action-servlet.xml,而使用ContextLoaderLisenter或ContextLoaderServlet方式加载Spring配置文件applicationContext.xml,通过两次加载完成Spring所有配置文件的加载。

至少有四种Spring与Struts整合方式:

1.      手工创建Spring 环境整合 Spring和Struts

为了Web应用环境可以和Spring的IoC容器很好的结合,Spring提供了专门用于Web应用

环境中的Spring容器——WebApplicationContext。使用ContextLoaderPlugIn装载 Spring 应

用程序环境时,ContextLoaderPlugIn会自动创建一个WebApplicationContext对象,并加载

相应的配置文件,然后将其保存在ServletContext中。之后所有的Servlet或Action便都可以过

ServletContext访问该WebApplicationContext实例并从中获取BO或DAO Bean。

ServletContext servletContext=this.getServlet().getServletContext(); 
WebApplicationContext ctx= 
        WebApplicationContextUtils.getWebApplicationContext(servletContext); 
UserInfoDAO userInfoDAO=(UserInfoDAO)ctx.getBean("userInfoDAO");
2.      使用 Spring 的 ActionSupport 类整合 Struts

org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法可以获取到WebApplicationContext实例,您所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展您的动作:

public class AddActionSupport extends ActionSupport { 
    public ActionForward execute(ActionMapping mapping, ActionForm form, 
            HttpServletRequest request, HttpServletResponse response) { 
        AddForm addForm = (AddForm) form; 
        UserInfo user=new UserInfo(); 
        user.setUserName(addForm.getName()); 
        user.setUserPwd(addForm.getPassword()); 
        UserInfoDAO userInfoDAO= 
                           (UserInfoDAO)getWebApplicationContext().getBean("userInfoDAO"); 
        userInfoDAO.save(user); 
        return mapping.findForward("success"); 
    } 
}
        结论:第1、2种整合方式由Spring来管理BO或DAO Bean,实现了表示层和业务逻辑层的解耦,但Struts的Action和Spring耦合在了一起,违反了Spring“非侵入”性原则;另外,Action类负责查找由Spring管理的Bean,也违背了Spring控制反转(IoC)的原则。以下第3、4种整合方式实现了由Spring来管理Struts Action,实现了Struts和Spring的解耦,从而解决了以上问题。

3.      使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor

用Spring的DelegatingRequestProcessor重载Struts 默认的 RequestProcessor。这样当收到一个针对Action的请求时,DelegatingRequestProcessor会自动从Spring Context中查找对应的Action Bean。

在struts-config.xml中添加:

<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
4.      【最佳方案】使用DelegatingActionProxy将Struts Action 管理全权委托给 Spring 框架

即:使用spring的aop动态代理机制

Action 的创建和对象的依赖注入全部由IOC容器来完成,使用Spring的DelegatingAcionProxy来帮助

实现代理的工作。DelegatingActiongProxy继承于org.apache.struts.action.Action 。此时需要将struts-

config.xml中所有Action类别全部配置为 org.springframework.web.struts.DelegatingActionProxy:

<action 
      attribute="loginForm" 
      input="/login.jsp" 
      name="loginForm" 
      path="/login" 
      scope="request" 
      type="org.springframework.web.struts.DelegatingActionProxy"> 
      <forward name="error" path="/error.html" /> 
      <forward name="success" path="/success.html" /> 
</action>

3、4两种方式都需要在WEB-INF下新建一个action-servlet.xml作为Spring context文件,创建Struts Action Bean,并对Action进行BO或DAO Bean注入:

<!--name 的取值一定要和Struts 配置文件action 中的path 的值相对应--> 
<bean name="/login" class="cn.qdqn.ssh.struts.action.LoginAction"> 
      <property name="userBO"> 
       <ref bean="userBO"/> 
      </property> 
</bean>

结论:

以上2种方式实现了由Spring管理Struts的Action,从而可以利用Spring在Struts Action中轻松的注入BO或DAO,还可以将 Spring 的 AOP 拦截器应用于Struts 动作,用最小的代价处理横切关注点。

第3种整合方式只需要配置一个<controller>,不需要改动Struts Action配置信息,但Struts的 RequestProcessor只能被重载一次,如果在应用中还要进行编码等其它功能RequestProcessor重载时,此种方式将异常繁琐。

第4种整合方式可以避免RequestProcessor的占用,但必须将struts-config.xml中所有Action类别全部配置为 org.springframework.web.struts.DelegatingActionProxy。

Spring与Struts1的集成相关推荐

  1. Spring Boot 极简集成 Shiro

    点击关注公众号,Java干货及时送达 1. 前言 Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理. Shiro有三大核心组件: Subject: ...

  2. 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo

    前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...

  3. Spring+SpringMVC+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  4. Spring与网关的集成

    这是有关Spring Integration系列的第二篇文章. 本文以我们介绍Spring Integration的第一篇文章为基础. 上下文设置 在第一篇文章中,我们创建了一个简单的Java应用程序 ...

  5. Spring Boot最新版集成邮件发送功能大全

    Spring Boot最新版集成邮件发送功能大全 前言 一.开启SMTP服务并获取授权码 二.创建Spring Boot项目 1.配置邮箱基本信息: 2.简单邮件发送: 3.发送带附件的邮件: 5.使 ...

  6. Spring MVC Hibernate MySQL集成CRUD示例教程

    Spring MVC Hibernate MySQL集成CRUD示例教程 我们在上一篇教程中学习了如何集成Spring和Hibernate.今天,我们将继续前进,并将Spring MVC和Hibern ...

  7. spring boot、mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问

    spring boot.mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问 1.原理实现介绍 本质来说使用连接池是为了节省创建.关闭数据库连接的资源消耗,从而提 ...

  8. Spring的junit4测试集成

    Spring的junit测试集成 Spring提供spring-test-4.2.4.RELEASE.jar 可以整合junit. 优势:可以简化测试代码(不需要手动创建上下文,即手动创建spring ...

  9. 10、Spring Boot 2.x 集成 Log4j2

    1.10 Spring Boot 2.x 集成 Log4j2 完整源码: Spring-Boot-Demos 转载于:https://www.cnblogs.com/Grand-Jon/p/99980 ...

最新文章

  1. Coolite Toolkit学习笔记五:常用控件Menu和MenuPanel
  2. 排列和组合简单的递归思路以及C++实现
  3. 云计算军事运用有啥特点
  4. 单链表的几个基本操作
  5. PHP后期静态绑定概念和用法
  6. 微信小程序获取用户唯一openid,包含java
  7. Nested Loop,Sort Merge Join,Hash Join
  8. 初识 Asp.Net内置对象之Request对象
  9. python模拟百度搜索点击链接_python采集百度搜索结果带有特定URL的链接代码实例...
  10. 安装Caffe报错:/usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7 is not a symbolic link
  11. Hyper-V 2016 系列教程40 使用 PowerShell 实现虚拟机自动化和管理虚拟机
  12. C/C++[结构体]
  13. 学习C语言目标及规划
  14. Java代码优化提点
  15. 2019重新起航:搭建个人博客
  16. 好佳居软装十大品牌 软装市场发展状况如何
  17. 学板绘可以找哪些工作?
  18. Gruobi多目标规划
  19. lg显示器工厂模式怎么进入_LG液晶显示器进入工厂模式方法
  20. 如何用transition实现翻书动画效果

热门文章

  1. python第三方库安装-python第三方库安装在哪
  2. 精通python爬虫框架-精通Python爬虫框架Scrapy PDF 中文清晰版
  3. 40岁学python有前途吗-西安新城区学python人工智能少儿编程哪家机构好
  4. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法
  5. 苹果电脑安装python-4. 在苹果系统上使用 Python
  6. python 科学计算基础教程电子版-Python 科学计算基础 (整理)
  7. python趣味编程10例-达人迷 Python趣味编程10例
  8. DS-1 数据结构和算法刷题
  9. LeetCode Super Pow(快速求幂算法)
  10. Nginx源码分析:3张图看懂启动及进程工作原理