??xml version="1.0" encoding="utf-8" standalone="yes"?>中文在线三区,久草在现在线,国产午夜在线观看http://www.aygfsteel.com/nexstone/zh-cnThu, 19 Jun 2025 23:55:35 GMTThu, 19 Jun 2025 23:55:35 GMT60Spring整合W三方MVC框架的通用配置http://www.aygfsteel.com/nexstone/archive/2007/11/10/159632.htmlnexstonenexstoneSat, 10 Nov 2007 14:14:00 GMThttp://www.aygfsteel.com/nexstone/archive/2007/11/10/159632.htmlhttp://www.aygfsteel.com/nexstone/comments/159632.htmlhttp://www.aygfsteel.com/nexstone/archive/2007/11/10/159632.html#Feedback0http://www.aygfsteel.com/nexstone/comments/commentRss/159632.htmlhttp://www.aygfsteel.com/nexstone/services/trackbacks/159632.html        最q在L刚老师著的《轻量J2EE企业应用实战》,写得非常不错Q尤其是对于象我q样的初学者很有帮助。我在学?fn)过E中Q自己做?jin)一些例子和ȝ。下面是关于Struts与Spring整合的知识?/p>

                            Spring整合W三方MVC框架的通用配置

        如果需要用第三方MVC框架Q则不能在web.xml文g中配|ApplicationContext的启动。但是,ApplicationContext是Spring的容器,负责理所有的lgQ从业务逻辑层组Ӟ到持久层lgQ都必须q行在Spring容器中。因此,必须在Web应用启动Ӟ创徏Spring的ApplicationContext实例。事实上QSpring ApplictionContext作ؓ(f)IoC容器Qd该优先加载?br /> 不管采用怎样的方法,Spring容器都应该在应用启动Ӟ自动加蝲。ؓ(f)?jin)让Spring容器能自动加载,通常有两个做法:(x)
1.让MVC框架负责创徏ApplicationContext实例QMVC框架加蝲时自动创建Spring容器。Struts是采用q种机制与Spring整合?br /> 2.采用load-on-startup Servlet实现?br /> Ҏ(gu)Servlet2.3标准Q所有的ServletContextListener都会(x)比Servlet优先加蝲——即使是load-on-startup Servlet。ApplicationContext实例是Spring容器Q负责管理应用中所有的lgQ包括业务逻辑层组件和持久层组件。因此,应该可能早的创建Spring容器?br /> 为此Q应该优先采用listener创徏ApplicationContext。只是,ServletContextListener是从Servlet 2.3才出现的规范。如果用了(jin)不支持Servlet2.3以上的Web服务器,则只能放弃ServletContextListenerQ采用load-on-startup Servlet{略?br /> Spring理的组件相当多Q如果将所有的lg部v在同一个配|文仉。不仅会(x)降低配置文g的可L,增大修改配置文g时引入错误的可能性,也不W合软g工程“分而治?#8221;的规则。通常推荐服务层对象,业务逻辑对象QDAO对象都存在于互不相同的Context中,而表现层对象如Spring MVC控制器,则被配置在表现层Context中。甚臛_某个特定模块的组仉|在单独的Context中?br /> 实际的应用中QSpring的配|文仉常不只一个,而是按功能被分成多个。好在,所有负责加载Spring容器的工具都可同时加载多个配|文件?/p>

一. 采用ContextLoaderListener创徏ApplicationContext
使用ContextLoaderListener创徏ApplicationContext必须服务器支持listenerQ下面这些服务器都是支持Listener的,如果使用q些服务器,则可以用ContextLoaderListener创徏ApplicationContext实例Q?br /> 1.Apache Tomcat 4.x+ ?br /> 2.etty 4.x+ ?br /> 3.Resin 2.1.8+ ?br /> 4.Orion 2.0.2+ ?br /> 5.BEA WebLogic 8.1 SP3?br /> Spring提供ServletContextListener的一个实现类ContextLoaderListenerQ该cd以作为listener使用Q它?x)在创徏时候自动查找W(wng)EB-INF/下的applicationContext.xml文gQ因此,如果只有一个配|文Ӟq且文g名ؓ(f)applicationContext.xmlQ只需在web.xml文g中增加如下一D即可:(x)
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多个配|文仉要蝲入,则考虑使用<context-param>元素来确定配|文件的文g名。ContextLoaderListener加蝲Ӟ?x)查扑֐为contextConfigLocation的参数。因此,配置context-param时参数名字应该是contextConfigLocation?br /> 带多个配|文件的web.xml文g如下Q?br /> <!--  XML文g的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  web.xml文g的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>
 <!--  定多个配置文g-->
在web.xml文g中加载Spring容器Q这是最常见的做法。Spring自己的MVC框架是采用q种{略?br /> 关于让MVC框架负责创徏ApplicationContext实例的情冉|较多Q因为每个MVC框架的启动机制有区别Q因此加载ApplicationContext的方式也各有不同?
对于在web.xml配置文g中配|ApplicationContext的自动创建有两种{略Q?br /> 1.利用ServletContextListener实现?br /> <context-param>
  <!--  参数名ؓ(f)contextConfigLocation -->
  <param-name>contextConfigLocation</param-name>
  <!--  多个配置文g之间?隔开 -->
  <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制定配置文gQSpring自动查找applicationContext.xml配置文g?br /> 如果有contextConfigLocationQ则利用该参数确定的配置文gQ该参数指定的一个字W串QSpring的ContextLoaderListener负责该字符串分解成多个配置文gQ逗号“,”、空?#8220; ”、分?#8220;;”都可作ؓ(f)字符串的分割W?br /> 如果既然没有applicationContext.xml文gQ也没有使用contextConfigLocation参数定配置文gQ或者contextConfigLocation定的配|文件不存在Q都导_(d)(x)Spring无法加蝲配置文gQ无法正常创建ApplicationContext实例?br /> SpringҎ(gu)bean定义创徏 WebApplicationContext对象Qƈ其保存在Web应用的ServletContext中。大部分情况下,应用中的bean无需感受到ApplicationContext的存在,只要利用ApplicationContext的IoC卛_?br /> 如果需要在应用中获取ApplicationContext实例Q可以通过如下Ҏ(gu)获取Q?br /> WebApplicationContext ctx =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
下面是采用Servlet获取ApplicationContext的完整源代码Q?br /> public class SpringTestServlet extends HttpServlet
{
 //Servlet的响应方法?br />  public void service(HttpServletRequest request, HttpServletResponse response)
  throws ServletException,java.io.IOException
 {z
  //获取Servlet的ServletContext对象
  ServletContext sc = getServletContext();
  //使用WebApplicationContextUtilsc获得ApplicationContext
  WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
  //获取Servlet的页面输出流
  PrintWriter out = response.getWriter();
  //ApplicationContext对象输出
  out.println(ctx);
 }
}
E序里手动获取ApplicationContext对象Q然后直接输出到Servlet的响应。结果看刎ͼApplicationContext加蝲?jin)web.xml文g中指定的两个配置文g?/p>

? 采用load-on-startup Servlet创徏ApplicationContext
如果容器不支持ListenerQ则只能使用load-on-startup Servlet创徏ApplicationContext实例Q下面的容器都不支持ListenerQ?br /> 1.BEA WebLogic up to 8.1 SP2?
2.IBM WebSphere 5.x ?br /> 3.Oracle OC4J 9.0.3?br /> Spring提供?jin)一个特D的Servletc:(x)ContextLoaderServlet。该Servlet在启动时Q会(x)自动查找W(wng)EB-INF/下的applicationContext.xml文g?br /> 当然Qؓ(f)?jin)让ContextLoaderServlet随应用启动而启动,应将此Servlet配置成load-on-startup的ServletQload-on-startup的值小一Ҏ(gu)较合适,因ؓ(f)要保证ApplicationContext优先创徏。如果只有一个配|文Ӟq且文g名ؓ(f)QapplicationContext.xml。在web.xml文g中增加如下一D即可:(x)
<servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
该Servlet用于提供“后台”服务Q作为容器管理应用中的其他beanQ不需要响应客戯求,因此无需配置servlet-mapping?br /> 如果有多个配|文Ӟ一样?lt;context-param>元素来确定多个配|文件。事实上Q不是ContextLoaderServletQ还是ContextLoaderListenerQ都依赖于ContextLoader创徏ApplicationContext实例。在ContextLoader代码的第240行,有如下代码:(x)
String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (configLocation != null) {
 wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
 ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
其中CONFIG_LOCATION_PARAM是该cȝ帔RQ其gؓ(f)contextConfigLocation。可看出QContextLoader首先(g)查servletContext中是否有contextConfigLocation的参敎ͼ如果有该参数Q则加蝲该参数指定的配置文g。带多个配置文g的web.xml文g如下Q?br /> <!--  XML文g的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  web.xml文g的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>
 <!--  定多个配置文g-->
 <context-param>
  <!--  参数名ؓ(f)contextConfigLocation -->
  <param-name>contextConfigLocation</param-name>
  <!--  多个配置文g之间?隔开 -->
  <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>
  <!--  下面值小一Ҏ(gu)较合适,?x)优先加?->
  <load-on-startup>1</load-on-startup>
</servlet>
</web-app>
试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与ContextLoaderListener底层都依赖于ContextLoader。因此,二者的效果几乎没有区别。之间区别不是它们本w引L(fng)Q而是׃Servlet2.3的规范:(x)listener比servlet优先加蝲。因此,采用ContextLoaderListener创徏ApplicationContext的时机更早?br /> 当然Q也可以通过ServletContext的getAttributeҎ(gu)获取ApplicationContextQ用WebApplicationContextUtilscL便捷Q因为无需CServletContext属性名。即使ServletContext的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性没有对应对象,W(xu)ebApplicationContextUtils的getWebApplicationContext()Ҏ(gu)会(x)q回I,而不?x)引起异常?br /> 获得?jin)WebApplicationContext实例的引用后Q可以通过bean的名字访问容器中的bean实例。大部分时候,无需通过q种方式讉K容器中的bean。将表现层的控制器bean|入容器的管理中Q客L(fng)h直接转发l容器中的beanQ然后由容器理bean之间的依赖,因此Q无需手动获取ApplicationContext引用。当?dng)每个框架都?x)有自q定的整合{略?/p>

nexstone 2007-11-10 22:14 发表评论
]]>
վ֩ģ壺 | | ӱ| | | | ƽ| | | | | | | | Ӧ| | üɽ| | ɽ| | ̷| | ۷| ء| | ֲ| ն| Ϫ| | ٰ| κ| ǿ| | ʡ| ƽ| | ӽ| | | ͨμ| |