`
yangzisai
  • 浏览: 87389 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

利用Struts的PlugIn来启动Spring容器

    博客分类:
  • ssh
阅读更多
6.4  Spring整合Struts
虽然Spring也提供了自己的MVC组件,但一来Spring的MVC组件过于繁琐,二     来Struts的拥护者实在太多。因此,很多项目都会选择使用Spring整合Struts框架。而且Spring确实可以无缝整合Struts框架,二者结合成一个更实际的J2EE开发平台。

6.4.1  利用Struts的PlugIn来启动Spring容器
使用Spring的Web应用时,不用手动创建Spring容器,而是通过配置文件声明式地创建Spring容器。因此,在Web应用中创建Spring容器有如下两个方式:

  ● 直接在web.xml文件中配置创建Spring容器。

  ● 利用第三方MVC框架的扩展点,创建Spring容器。

其实第一种创建Spring容器的方式更加常见。为了让Spring容器随Web应用的启动而自动启动,有如下两个方法:

  ● 利用ServletContextListener实现。

  ● 采用load-on-startup Servlet实现。

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 version="1.0" encoding="GBK"?>

<!-- 指定Web配置文件的根元素,以及相应的Schema信息 -->

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

    version="2.4">

    <!-- 确定多个配置文件 -->

    <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会自动查找application- Context.xml配置文件;如果有contextConfigLocation,则利用该参数确定的配置文件。如果无法找到合适的配置文件,Spring将无法正常初始化。

Spring根据bean定义创建WebApplicationContext对象,并将其保存在web应用的ServletContext中。大部分情况下,应用中的Bean无须感受到ApplicationContext的存在,只要利用ApplicationContext的IoC即可。

如果需要在应用中获取ApplicationContext实例,可以通过如下代码获取:

//获取当前Web应用的Spring容器

WebApplicationContext ctx =

    WebApplicationContextUtils.getWebApplicationContext(servletContext);

除此之外,Spring提供了一个特殊的Servlet类ContextLoaderServlet。该Servlet在启动时,会自动查找WEB-INF/下的applicationContext.xml文件。

当然,为了让ContextLoaderServlet随应用的启动而启动,应将此Servlet配置成load-on-startup的Servlet,load-on-startup的值小一点比较合适,这样可以保证Application- Context更快的初始化。

如果只有一个配置文件,并且文件名为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用于提供“后台”服务,主要用于创建Spring容器,无须响应客户请求,因此无须配置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的参数,如果有该参数,则加载该参数指定的配置文件。

ContextLoaderServlet与ContextLoaderListener底层都依赖于ContextLoader。因此,二者的效果几乎没有区别。之间的区别不是它们本身引起的,而是由于Servlet规范,Listener比Servlet优先加载。因此,采用ContextLoaderListener创建ApplicationContext的时机更早。

当然,也可以通过ServletContext的getAttribute方法获取ApplicationContext。但使用WebApplicationContextUtils类更便捷,因为无须记住ApplicationContext的属性名。即使ServletContext的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRI- BUTE属性没有对应对象,WebApplicationContextUtils的getWebApplicationContext()方法将会返回空,而不会引起异常。

到底需要使用Listener,还是使用load-on-startup Servlet来创建Spring容器呢?通常推荐使用Listener来创建Spring容器。但Listerner是Servlet 2.3以上才支持的标准,因此,必须Web容器支持Listener才可使用Listerner。

注意:使用Listener创建Spring容器之前,应先评估Web容器是否支持Listener标准。

还有一种情况,利用第三方MVC框架的扩展点来创建Spring容器,比如Struts。在第2章介绍Strust框架时,知道Struts有一个扩展点PlugIn。

实际上,Spring正是利用了PlugIn这个扩展点,从而提供与Struts的整合。Spring提供了PlugIn接口的实现类org.springframework.web.struts.ContextLoaderPlugIn。这个实现类可作为Struts的PlugIn配置,Struts框架启动时,将自动创建Spring容器。

为了利用Struts的PlugIn创建Spring容器,只需在Struts配置文件中增加如下片段   即可:

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

  <set-property property="contextConfigLocation"

      value="/WEB-INF/action-servlet.xml,/WEB-INF/applicationContext.
      xml"/>

</plug-in>

其中,指定contextConfigLocation属性值时,即可以指定一个Spring配置文件的位置,可以指定多个Spring配置文件的位置。
分享到:
评论

相关推荐

    struts2-spring-plugin-2.3.4.jar

    Struts2-Spring-Plugin-2.3.4.jar 是一个专门为 Struts 2 框架和 Spring 框架整合而设计的插件,主要用于处理 Struts 2 和 Spring 之间的集成问题。在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖...

    struts2-spring-plugin-2.2.1.jar

    1. **自动扫描和实例化Action类**:插件会自动扫描指定包下的Action类,并通过Spring容器来创建和管理这些Action实例。 2. **依赖注入**:Struts2的Action可以通过字段或者构造函数接收Spring管理的bean,实现依赖...

    SSH\\others\\struts2-spring-plugin-2.2.1.jar

    总之,"struts2-spring-plugin-2.2.1.jar"是Struts2框架与Spring框架集成的关键,它使得开发者能够利用Spring的强大功能来构建更加灵活和可维护的Struts2应用。而其他的数据库相关库则可能用于实现Java应用与SQL ...

    struts2-spring-plugin-2.2.3.jar

    这样一来,当Struts2接收到请求时,会通过插件从Spring容器中获取相应的Action实例来执行请求处理。 压缩包中的"struts2-spring-plugin-2.2.3.jar"文件就是这个插件的实现,包含了所有必要的类和资源。而"structs2-...

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    `struts2-spring-plugin-2.5.16.jar`是Struts2与Spring集成的插件,它使得Struts2可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力。通过这个插件,我们可以将Action类的实例化和管理交给Spring容器,从而...

    struts2-spring-plugin-2.2.3.1.jar

    **Struts2-Spring-Plugin** 是这两者之间的桥梁,它允许Struts2的动作类(Action)和其他组件能够成为Spring容器的一部分,享受Spring提供的所有服务。这样,开发者无需在Struts2的Action类中手动创建依赖对象,而是...

    struts2-spring-plugin-2.2.1.1.jar

    1. **依赖注入**:该插件允许Spring容器管理Struts 2的Action对象,实现依赖注入。这意味着Action类的实例由Spring创建和管理,可以方便地注入其他服务或DAO,减少硬编码的依赖关系。 2. **生命周期管理**:通过...

    struts2-spring-plugin-2.0.11.1.jar

    在Struts2中引入Spring插件,可以将Struts2的动作类(Action)声明为Spring的bean,这样Struts2就可以通过Spring容器来管理和实例化这些动作类。这样做的好处包括: 1. **依赖注入**:通过Spring的DI功能,可以方便...

    struts2-spring-plugin-2.1.2.jar

    struts2与spring的整合。导入struts2-spring-plugin包,在web.xml中设置spring的监听器, spring监听器对应的API类为:org.spring... struts2-spring-plugin包为我们将struts2的对象工厂设置为spring的IoC容器,

    struts2和spring结合插件原理

    有了这个插件,spring容器才能在全应用中适用。 在我们集成struts2+spring+hibernate,也就是所谓的S2SH,不可避免的要引入struts2-spring-plugin.jar插件。 本文介绍了该插件的使用方式,工作原理,和常见问题

    struts 整合spring 例子,测试通过

    **6.4.1 利用Struts的PlugIn来启动Spring容器** 在整合过程中,Spring通常不会直接参与到Struts的Action实例化中。相反,Struts使用插件(PlugIn)机制来启动Spring容器。有两种方法创建Spring容器: 1. **直接在...

    整合struts2和spring

    在Struts2和Spring整合中,可以使用Spring提供的拦截器,例如`org.springframework.web.struts.DelegatingInterceptor`,它能让Spring容器处理Action的实例化。 7. **事务管理**:Spring提供了强大的事务管理功能。...

    struts2与spring2的整合

    整合Struts2和Spring2的主要目标是将Spring的DI功能引入到Struts2的Action类中,使得Action类的依赖可以在Spring容器中被管理。这样,Action类不再需要自行创建依赖对象,而是通过Spring来获取,增强了代码的可维护...

    Spring,hibernate,struts jar 最新jar包

    Spring是一个全面的后端开发框架,它提供了一个丰富的IoC(Inversion of Control,控制反转)容器来管理对象的依赖关系,以及AOP(Aspect Oriented Programming,面向切面编程)功能,用于实现跨切面的关注点。...

    Struts1说明以及整合Spring

    - 通过这种方式,实际执行的`Action`由Spring容器决定。 4. **配置Spring的bean**: - 在`applicationContext.xml`文件中定义对应的bean,例如: ```xml &lt;property name="ud" ref="ud"&gt;&lt;/property&gt; ``` -...

    Spring整合Struts 的详细开发文档

    整合 Spring 和 Struts 可以利用 Struts 的 PlugIn 机制来启动 Spring 容器,这样可以在 Struts 框架运行时无缝集成 Spring 的功能。以下是整合步骤的详细说明: 1. **创建 Spring 容器**: - Spring 容器可以通过...

    Struts2与Spring整合的demo

    - **Action代理**:Struts2-Spring插件会自动查找Spring容器中的Action Bean,避免了手动创建Action实例。 - **结果映射**:Struts2的结果映射依然正常配置,但Action的实例由Spring提供。 6. **优势**: - **松...

    struts2和Spring整合需要的jar包

    整合这两者,我们可以将Struts2的动作控制与Spring的依赖注入结合,使得业务逻辑组件可以方便地通过Spring容器进行管理,同时利用Struts2的控制器来处理HTTP请求。 **整合步骤:** 1. **添加必要的JAR包**:整合...

    Struts2框架整合Spring整合步骤

    这样,当你在Action中声明依赖时,Struts2会从Spring容器中查找并注入相应的Bean。 6. **运行与测试** 配置完成后,部署你的Web应用并进行测试。通过访问配置的Action,验证Struts2是否能正确地调用由Spring管理...

Global site tag (gtag.js) - Google Analytics