`
abalone
  • 浏览: 130756 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring和Struts整合

阅读更多
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>
注意:

用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 框架


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和struts整合的三种方案

    Spring 和 Struts 整合是企业级 Java 应用开发中常见的技术组合,它们各自在应用程序架构中扮演着重要的角色。Spring 提供了依赖注入(DI)和面向切面编程(AOP),而 Struts 则是一个经典的MVC框架,用于处理用户...

    spring 和 struts整合

    将Spring与Struts整合可以充分利用两者的优点,实现松耦合和高效的业务逻辑处理。 在整合Spring和Struts的过程中,主要涉及以下几个关键点: 1. **配置Struts Action**: 在`struts-config.xml`中,我们需要定义...

    Spring 和 struts 整合的三种方式

    以下将详细阐述Spring与Struts整合的三种方式: 1. **使用Spring的ActionSupport** 这种方式是通过让Struts的Action类继承Spring的`ActionSupport`类,使Action类能够访问Spring的ApplicationContext。首先,在`...

    Spring和Struts整合---继承ActionSupport的方法

    通过以上步骤,我们可以成功地将Spring和Struts整合,使得应用具备更好的结构、更高的可测试性和更低的维护成本。同时,继承`ActionSupport`可以方便地利用Struts2提供的验证和错误处理机制,提升开发效率。

    Spring和Struts整合例子

    将Spring与Struts整合可以充分利用两者的优点,提高开发效率和应用的可维护性。 整合Spring和Struts的过程主要包括以下几个关键步骤: 1. **环境准备**:首先,确保你的开发环境中已经安装了Java、Eclipse或...

    Spring 和struts 整合的三种方式

    下面我们将详细探讨Spring与Struts整合的三种方式。 **一、使用Spring的ActionSupport** Spring的ActionSupport类是实现Struts 1或2的Action接口的一个便捷选项,它提供了一些便利的功能,如国际化支持和模型驱动...

    Spring和Struts整合用到的jar包

    - Spring也可以通过ViewResolver来解析视图,但通常在Struts整合中,视图解析由Struts完成。 6. **测试和调试**: - 编写单元测试和集成测试,确保Spring和Struts能够正常交互。 - 使用日志框架(如Log4j)记录...

    spring与struts整合开发包

    6. **国际化与主题支持**:Spring和Struts整合后,可以利用Struts的国际化和主题功能,结合Spring的资源文件加载,实现全球化和界面定制。 7. **错误与异常处理**:通过Spring的AOP,可以集中处理Struts中的异常,...

    Spring4.0.6+Struts2.3.16.3整合架包下载,ss整合jar架包下载,最新spring和struts整合架包下载

    "Spring4.0.6+Struts2.3.16.3整合架包下载" 提到的是这两个框架的特定版本,Spring 4.0.6 是 Spring 框架的一个稳定版本,它带来了许多改进和优化,比如对 Java 8 的支持、更强大的类型安全的配置以及对 Servlet 3.0...

    Spring与struts整合是jar包

    在实现spring与struts框架的整合我们都要用到一些jar包,然而众多的jar使人眼花缭乱,在这文件里面就是完整的二者的整合时用得到的jar包,一个不多,一个不少。用时直接导入(或者copy)即可

    spring hibernate struts整合

    在Spring和Struts整合时,Spring可以作为Action的依赖注入容器,提供业务对象给Struts,从而减少代码耦合。 4. **整合过程**: - **配置Spring**:创建Spring的配置文件,如`applicationContext.xml`,定义Bean的...

    Spring + struts 整合的三种主要方式

    ### Spring与Struts整合的三种主要方式 在Java Web开发领域,Spring框架和Struts框架都是非常重要的技术。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能,为Java应用提供了轻量级的解决方案。而...

    spring与struts2整合

    Spring 和 Struts2 是两个...总之,Spring 和 Struts2 的整合利用了两者的优势,提供了一种强大的方式来构建可扩展、易于维护的 Java Web 应用。通过深入学习和实践,开发者可以掌握这种整合技巧,并在实际项目中应用。

    JPA+Spring+Struts整合实例,JPA+Spring+Struts整合实例

    通过以上步骤,你就能完成一个基本的JPA+Spring+Struts整合应用。这种整合方式能充分利用每个框架的优点,提高代码的可维护性和可扩展性,降低开发复杂度。在实际项目中,你可能还需要考虑异常处理、安全控制、性能...

    Spring与struts整合开发实例

    Spring与struts整合主要有三种方式,通过Spring的ActionSupport类,通过Spring的DelegatingRequestProcessor类、通过Spring的DelegatingActionProxy类。

    spring_struts整合jar包

    2. **Spring MVC与Struts2的集成**:虽然两者都有MVC模式,但在整合时,通常会使用Struts2来处理请求的路由和响应,而Spring MVC则处理更复杂的视图解析和数据绑定。 3. **Spring事务管理**:Spring提供了强大的...

    Spring与Struts 2整合.zip

    整合Spring和Struts 2的主要目的是将Spring的依赖注入和管理能力引入到Struts 2的Action中,以及利用Spring的AOP进行事务管理。整合步骤通常包括以下几个部分: 1. **添加依赖**:在项目中引入Spring和Struts 2的库...

    Spring与Struts2整合

    Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,而Struts2则以其优秀的MVC设计模式著称,两者整合可以构建出高效、可维护的Web应用。下面将详细介绍Spring与Struts2整合的相关知识点。 **一、整合背景*...

    spring,struts1.x ,hibernate整合

    Spring、Struts1.x 和 Hibernate 是经典的 Java Web 开发框架,它们的整合是构建企业级应用的常见方式。这三个框架分别负责不同的职责:Spring 提供依赖注入和事务管理,Struts1.x 负责视图和控制层,而 Hibernate ...

    spring_struts_hibernate整合开发书籍

    《Spring+Struts+Hibernate整合开发》是一本深入讲解企业级Java应用开发的书籍,它主要聚焦于三大著名开源框架——Spring、Struts和Hibernate的集成与应用。这些框架是Java Web开发中的基石,广泛应用于各种复杂的...

Global site tag (gtag.js) - Google Analytics