`
hahalzb
  • 浏览: 166184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts与Spring整合

阅读更多

如果需要使用第三方MVC框架,则不能在web.xml文件中配置ApplicationContext的启动。但是, ApplicationContext是Spring的容器,负责管理所有的组件,从业务逻辑层组件,到持久层组件,都必须运行在Spring容器中。因 此,必须在Web应用启动时,创建Spring的ApplicationContext实例。事实上,Spring ApplictionContext作为IoC容器,总应该优先加载。
不管采用怎样的方法,Spring容器都应该在应用启动时,自动加载。为了让Spring容器能自动加载,通常有两个做法:
1.让MVC框架负责创建ApplicationContext实例,MVC框架加载时自动创建Spring容器。Struts就是采用这种机制与Spring整合。
2.采用load-on-startup Servlet实现。
根据Servlet2.3标准,所有的ServletContextListener都会比Servlet优先加载——即使是load-on- startup Servlet。ApplicationContext实例是Spring容器,负责管理应用中所有的组件,包括业务逻辑层组件和持久层组件。因此,应该 尽可能早的创建Spring容器。
为此,应该优先采用listener创建ApplicationContext。只是,ServletContextListener是从Servlet 2.3才出现的规范。如果使用了不支持Servlet2.3以上的Web服务器,则只能放弃ServletContextListener,采用load -on-startup Servlet策略。
Spring管理的组件相当多,如果将所有的组件部署在同一个配置文件里。不仅会降低配置文件的可读性,增大修改配置文件时引入错误的可能性,也不符合软 件工程“分而治之”的规则。通常推荐服务层对象,业务逻辑对象,DAO对象都存在于互不相同的Context中,而表现层对象如Spring MVC控制器,则被配置在表现层Context中。甚至将某个特定模块的组件部署在单独的Context中。
实际的应用中,Spring的配置文件通常不只一个,而是按功能被分成多个。好在,所有负责加载Spring容器的工具都可同时加载多个配置文件。

一. 采用ContextLoaderListener创建ApplicationContext
使用ContextLoaderListener创建ApplicationContext必须服务器支持listener,下面这些服务器都是支持 Listener的,如果使用这些服务器,则可以使用ContextLoaderListener创建ApplicationContext实例:
1.Apache Tomcat 4.x+ 。
2.etty 4.x+ 。
3.Resin 2.1.8+ 。
4.Orion 2.0.2+ 。
5.BEA WebLogic 8.1 SP3。
Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为listener 使用,它会在创建时候自动查找WEB-INF/下的applicationContext.xml文件,因此,如果只有一个配置文件,并且文件名为 applicationContext.xml,只需在web.xml文件中增加如下一段即可:
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多个配置文件需要载入,则考虑使用<context-param>元素来确定配置文件的文件名。 ContextLoaderListener加载时,会查找名为contextConfigLocation的参数。因此,配置context- param时参数名字应该是contextConfigLocation。
带多个配置文件的web.xml文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- web.xml文件的DTD等信息-->
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
在web.xml文件中加载Spring容器,这是最常见的做法。Spring自己的MVC框架就是采用这种策略。
关于让MVC框架负责创建ApplicationContext实例的情况比较多,因为每个MVC框架的启动机制有区别,因此加载ApplicationContext的方式也各有不同。 
对于在web.xml配置文件中配置ApplicationContext的自动创建有两种策略:
1.利用ServletContextListener实现。
<context-param>
   <!-- 参数名为contextConfigLocation -->
   <param-name>contextConfigLocation</param-name>
   <!-- 多个配置文件之间以,隔开 -->
   <param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 采用listener创建ApplicationContext实例-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
如果没有contextConfigLocation制定配置文件,Spring自动查找applicationContext.xml配置文件。
如果有contextConfigLocation,则利用该参数确定的配置文件,该参数指定的一个字符串,Spring的ContextLoaderListener负责将该字符串分解成多个配置文件,逗号“,”、空格“ ”、分号“;”都可作为字符串的分割符。
如果既然没有applicationContext.xml文件,也没有使用contextConfigLocation参数确定配置文件,或者 contextConfigLocation确定的配置文件不存在,都将导致:Spring无法加载配置文件,无法正常创建 ApplicationContext实例。
Spring根据bean定义创建 WebApplicationContext对象,并将其保存在Web应用的ServletContext中。大部分情况下,应用中的bean无需感受到 ApplicationContext的存在,只要利用ApplicationContext的IoC即可。
如果需要在应用中获取ApplicationContext实例,可以通过如下方法获取:
WebApplicationContext ctx = 
WebApplicationContextUtils.getWebApplicationContext(servletContext);
下面是采用Servlet获取ApplicationContext的完整源代码:
public class SpringTestServlet extends HttpServlet 
{
//Servlet的响应方法。
public void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException,java.io.IOException
{z
   //获取Servlet的ServletContext对象
   ServletContext sc = getServletContext();
   //使用WebApplicationContextUtils类获得ApplicationContext
   WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
   //获取Servlet的页面输出流
   PrintWriter out = response.getWriter();
   //将ApplicationContext对象输出
   out.println(ctx);
}
}
程序里手动获取ApplicationContext对象,然后直接输出到Servlet的响应。结果看到,ApplicationContext加载了web.xml文件中指定的两个配置文件。

二. 采用load-on-startup Servlet创建ApplicationContext
如果容器不支持Listener,则只能使用load-on-startup Servlet创建ApplicationContext实例,下面的容器都不支持Listener:
1.BEA WebLogic up to 8.1 SP2。 
2.IBM WebSphere 5.x 。
3.Oracle OC4J 9.0.3。
Spring提供了一个特殊的Servlet类:ContextLoaderServlet。该Servlet在启动时,会自动查找WEB-INF/下的applicationContext.xml文件。
当然,为了让ContextLoaderServlet随应用启动而启动,应将此Servlet配置成load-on-startup的Servlet, load-on-startup的值小一点比较合适,因为要保证ApplicationContext优先创建。如果只有一个配置文件,并且文件名为: applicationContext.xml。在web.xml文件中增加如下一段即可:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
该Servlet用于提供“后台”服务,作为容器管理应用中的其他bean,不需要响应客户请求,因此无需配置servlet-mapping。
如果有多个配置文件,一样使用<context-param>元素来确定多个配置文件。事实上,不管是 ContextLoaderServlet,还是ContextLoaderListener,都依赖于ContextLoader创建 ApplicationContext实例。在ContextLoader代码的第240行,有如下代码:
String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (configLocation != null) {
wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
其中CONFIG_LOCATION_PARAM是该类的常量,其值为contextConfigLocation。可看出:ContextLoader 首先检查servletContext中是否有contextConfigLocation的参数,如果有该参数,则加载该参数指定的配置文件。带多个配 置文件的web.xml文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- web.xml文件的DTD等信息-->
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
<context-param>
   <!-- 参数名为contextConfigLocation -->
   <param-name>contextConfigLocation</param-name>
   <!-- 多个配置文件之间以,隔开 -->
   <param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 采用load-on-startup Servlet创建ApplicationContext实例-->
<servlet>
   <servlet-name>context</servlet-name>
   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
   <!-- 下面值小一点比较合适,会优先加载-->
   <load-on-startup>1</load-on-startup>
</servlet>
</web-app>
测试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与ContextLoaderListener底层都依赖于 ContextLoader。因此,二者的效果几乎没有区别。之间区别不是它们本身引起的,而是由于Servlet2.3的规范:listener比 servlet优先加载。因此,采用ContextLoaderListener创建ApplicationContext的时机更早。
当然,也可以通过ServletContext的getAttribute方法获取ApplicationContext,使用 WebApplicationContextUtils类更便捷,因为无需记住ServletContext属性名。即使ServletContext的 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性没有对应对象, WebApplicationContextUtils的getWebApplicationContext()方法将会返回空,而不会引起异常。
获得了WebApplicationContext实例的引用后,可以通过bean的名字访问容器中的bean实例。大部分时候,无需通过这种方式访问容 器中的bean。将表现层的控制器bean置入容器的管理中,客户端请求直接转发给容器中的bean,然后由容器管理bean之间的依赖,因此,无需手动 获取ApplicationContext引用。当然,每个框架都会有自己特定的整合策略。

分享到:
评论

相关推荐

    ssh整和技术struts与hibernate整合,struts与spring整合,hibernate与spring整合,struts,hibernate,sp

    Struts技术资料 hibernate技术资料 spring技术资料 ssh整合技术(struts与hibernate整合,struts与spring整合,hibernate与spring整合,struts,hibernate,spring整合)

    第27讲--Struts与Spring集成方案1(Struts集成Spring)

    在"第27讲--Struts与Spring集成方案1(Struts集成Spring)"中,我们主要探讨如何将Struts2与Spring进行整合。集成的主要目的是利用Spring的强大功能来管理Struts2中的Action类,从而实现更灵活的依赖注入和更好的控制...

    EJB3与Struts与Spring整合开发(SSE)

    在"EJB3与Struts与Spring整合开发(SSE)"的场景中,开发者可能将EJB3作为业务逻辑层,处理复杂的业务操作;Struts作为前端控制器,负责用户交互和请求转发;而Spring则作为整个应用的“胶水”,实现各层间的协调和...

    struts 与spring整合关键点

    以上就是Struts与Spring整合的关键点,整合这两个框架可以使应用程序更易于测试和维护,同时充分利用Spring的强大功能,如依赖注入和事务管理,提高开发效率和应用质量。在实际项目中,需要根据具体需求选择合适的...

    struts和spring整合(两种实现方法)

    用DelegatingRequestProcessor和DelegatingActionProxy两种方法实现struts和spring的整合,不同的地方就在struts-config.xml文件中,当前文件中DelegatingRequestProcessor是注释的。

    第28讲--Struts与Spring集成方案2(Spring集成Struts)

    Struts和Spring是两个在Java Web开发中广泛使用的框架,它们各自解决了一部分问题,但结合起来...总之,Struts与Spring的集成是Java Web开发中的常见实践,它让两个框架的能力相辅相成,为开发者提供了更强大的工具集。

    struts与spring的整合

    将Struts与Spring整合可以充分利用两者的优点,实现更高效、更灵活的开发。 **Struts框架详解** Struts是Apache软件基金会的一个开源项目,基于MVC设计模式,主要解决了JSP模型2架构中的控制器问题。它通过...

    SSH(struts2,Hibernate,Spring)整合及测试亲测可用

    SSH,即Struts2、Hibernate和Spring的组合,是Java Web开发中的一种经典框架集成,用于构建企业级的MVC(Model-View-Controller)应用。这个整合旨在提供一个高效、灵活且可扩展的开发环境,使开发者可以专注于业务...

    struts+spring+hibernate整合

    通过以上步骤,一个基本的Struts、Spring和Hibernate整合的应用就搭建完成了。这个整合的关键在于Struts处理HTTP请求,Spring管理业务对象和依赖,而Hibernate则处理数据库操作。这样的架构可以实现松耦合,便于代码...

    Struts Hibernate Spring集成开发宝典 源码

    《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...

    SSH整合源码(Struts+Spring+Hibernate整合用户注册例子)

    SSH整合,全称为Struts、Spring和Hibernate的集成,是一种常见的Java Web开发框架组合,用于构建高效、可维护的企业级应用程序。在这个例子中,我们看到的是一个基于SSH的用户注册功能的实现,使用的开发工具是...

    Eclipse Struts、Spring整合

    **Eclipse Struts与Spring整合详解** 在Java Web开发领域,Struts和Spring都是非常重要的框架,它们分别在MVC模式和依赖注入方面扮演着关键角色。Struts作为一个经典的MVC框架,帮助开发者构建可维护的、结构清晰的...

    struts1 spring ibatis整合项目源码

    struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码

    Struts+spring简单实例

    7. ** strutsspring-plugin**:为了简化Struts和Spring的集成,存在strutsspring-plugin这个库,它可以自动将Spring管理的Bean暴露给Struts,减少了手动配置的工作。 8. **测试**:Struts+Spring的集成使得单元测试...

    Struts,Hibernate,Spring集成开发宝典.pdf

    《Struts Hibernate Spring集成开发宝典》选取的实例繁简适中,与实际开发工作紧密结合,内容讲解由浅入深、循序渐进,可以满足不同层次读者的需求。 作者简介 陈天河,具有多年的软件开发经验,从事基于Java的Web...

    Struts+Spring+Hibernate整合教程.pdf

    整合Struts、Spring和Hibernate可以构建出高度模块化的应用,提高开发效率和代码质量。然而,随着Java EE技术的发展,现代Web应用更多地转向Spring Boot、Spring MVC和MyBatis等更现代的解决方案,它们在易用性、...

    struts2与spring2的整合

    本文将深入探讨Struts2与Spring2的整合过程及其背后的原理。 首先,Struts2是一个基于MVC设计模式的Web应用框架,它主要负责处理HTTP请求,提供强大的动作(Action)和结果(Result)管理,以及丰富的插件系统。...

    struts hibernate spring集成开发宝典光盘源码(一).rar

    struts hibernate spring集成开发宝典光盘源码(一).rar

    struts+spring集成

    3. **配置集成**:在Struts2的配置文件中,我们需要声明一个Struts2-Spring插件,它允许Struts2与Spring进行通信。同时,在Spring的配置文件中,需要定义Action类的bean,并配置好相关属性和依赖。 4. **AOP结合**...

Global site tag (gtag.js) - Google Analytics