在上一篇文章中我们了解到了第一种Spring跟Struts集成的方案,但此集成方案的不足是WEB层中知道Spring的相关内容,因为需要去主动的查找对象:BeanFactory.方案二便是通过依赖注入的方式来进行.通过Spring提供ActionProxy进行代理.去获取BeanFactory,找到Path的名称,然后找到path路径下的Action,然后完成注入.

方案二的核心:Struts的核心交给Spring来创建.Spring跟其他框架集合主要也是通过此种方式.

方案二集成框架图:

spring+struts(第二种方案)

集成原理:将业务逻辑对象(Struts的Action)交给Spring进行创建.创建之后业务逻辑对象就会被注入.这样就不会有依赖查找.

1 spring 和struts依赖包配置.

*struts

--拷贝struts相关java包和jstl.

--在web.xml中配置ActionServlet.

--提供struts-config.xml核心配置文件.

--提供struts国际化资源文件,最好提供默认国际化文件.

*spring

--拷贝spring相关java包

*SPRING_HOME/dist/spring.jar

*SPRING_HOME/lib/log4j/log4j-1.2.14.jar

*SPRING_HOME/lib/jakarta-commons/commons-logging.jar

*SPRING_HOME/lib/aspectj/aspectjrt.jar

*SPRING_HOME/lib/aspectj/aspectjweaver.jar

--提供spring配置文件.

2 在web.xml文件中配置ContextLoaderListener,让WebServer启动的时候将BeanFactory放在ServletContext中

代码如下:

  1. <!-- 找到文件名 -->
  2. <context-param>
  3. <!-- 此处的名字是固定死的,在ContextLoader里中的一个常量 -->
  4. <param-name>contextConfigLocation</param-name>
  5. <param-value>classpath:applicationContext-*.xml</param-value>
  6. </context-param>
  7. <!-- 设置Listener,一次性创建BeanFactory -->
  8. <listener>
  9. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  10. </listener>

3 struts-config.xml文件中的<action>标签的type属性需要更改为Spring的代理Action类:org.springframework.web.struts.DelegatingActionProxy

代理Action的作用:取得BeanFactory,然后在IoC容器中将本次请求的Action取出来,随后依赖对象会被注入.

4 将Action交给Spring创建,必须配置业务逻辑对象,注入给Action

  1. <bean
  2. name="/login"
  3. class="com.tgb.struts.usermgr.web.actions.LoginAction"  scope="prototype">
  4. <property name="userManager" ref="userManager"> </property>
  5. </bean>

在配置业务逻辑对象的时候需要注意一下细节:

1 必须使用name属性,而且name属性的值必须和struts-config.xml文件中的action标签的path属性值一致.

2 建议将scope="prototype"这样struts的Action是线程安全的.

总结:

以上便是Spring跟Struts集成方案2 ,通过两种方案进行对比可以看到.第二种方案将BeanFactory纳入Spring管理,这样WEB层就不需要去主动查找对象,而是通过Spring的依赖注入获得对象.

Spring+Struts集成(第二种方案)的更多相关文章

  1. 【Swagger】可能是目前最好的 Spring Boot 集成 swagger 的方案

    [Swagger]可能是目前最好的Spring Boot集成 swagger 的方案 ![](https://img2018.cnblogs.com/blog/746311/201909/746311 ...

  2. Struts1.X与Spring集成——第一种方案

    spring+struts(第一种方案) 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象,调用业务逻辑方法. 一,新建一个项目Spring_Strut ...

  3. spring框架总结(03)重点介绍(Spring框架的第二种核心掌握)

    1.Spring的AOP编程 什么是AOP?  ----- 在软件行业AOP为Aspect Oriented Programming  也就是面向切面编程,使用AOP编程的好处就是:在不修改源代码的情 ...

  4. Spring+Struts集成(方案一)

    SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...

  5. Spring boot 集成三种定时任务方式

    三种定时任务方式分别为 org.springframework.scheduling.annotation.Scheduled java.util.concurrent.ScheduledExecut ...

  6. Spring boot 集成三种拦截方式

    三种拦截方式分别为: javax.servlet.Filter org.springframework.web.servlet.HandlerInterceptor org.aspectj.lang. ...

  7. 集成Struts2+Spring+Hibernate_两种方案

    集成Struts2+Spring+Hibernate 第一种方案:让Spring创建Struts2的Action,不让Spring完全管理Struts2的Action      Struts2 Act ...

  8. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  9. Linux下实现秒级定时任务的两种方案(crontab 每秒运行)

    第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab ...

随机推荐

  1. Python基础学习7---异常处理

    处理异常 我们可以使用 try..except 语句来处理异常.我们把通常的语句放在try-块中,而把我们的错误处理语句放在except-块中. import sys try: s = raw_inp ...

  2. iosOC不可变数组遍历

    NSArray * array = @[@"1",@"2",@"3"]; NSLog(@"%@",array); //1 ...

  3. 50、matplotlib画图示例

    1.画饼图 import matplotlib.pyplot as plt >>> labels = 'frogs','hogs','dogs','logs' >>> ...

  4. centos下安装与配置Apache方法

    下面以httpd-2.0.55.tar.gz版本为例,介绍Apache在Linux中的安装过程:1.解压和解包安装文件:gzip -d httpd-2.0.55.tar.gztar xvf httpd ...

  5. js 条件判断放大字体

    <html> <head> <meta charset="utf-8" /> <title></title> <s ...

  6. 发现在看完objc基本语法之后,还是看Apple文档比较有用。

    现在已经停止找中文资料了,因为很多例子已经过时,运行不出来. 看完objc基本语法以后,Apple的资料也看得懂了. 还是应该跟着Apple的入门指南开始学,今后也应该以Apple的文档为主.

  7. Linux网卡配置与绑定

    一定要在服务管理中关闭NetworkManager服务并禁用自动启动. 第一步:先查看下本机网卡,使用命令到network-scripts 下 [root@root~]# cd /etc/syscon ...

  8. style控制打印分页

    [转载地址:http://www.cnblogs.com/JustinYoung/articles/710734.html]page-break-before和page-break-after CSS ...

  9. js打印保存用户输入的内容

    在用js打印局部页面时,遇到用户新输入的内容没能打印出来,经过观察,发现我采用的js打印方法是读取页面源代码,而用户输入的内容如果不将其写入到页面源代码中去,是打印不出来的,下面是我的解决方法: // ...

  10. Git如何删除版本库中的一个提交?

     如果不小心增加了一个最新的提交,可以通过以下的操作删除,记住:是删除最新的提交,如果回滚到其他的提交上面,就会导致之后的全部消失. 1.git reset --hard HEAD~1    2.gi ...