Struts的Action访问spring的ApplicationContext的问题

16 篇文章 0 订阅
一.在spring与struts整合过程中,如何引入并初始化ApplicationContext??

有几种方式??

1. 使用web.xml的<listener>方式引入并初始化ApplicationContext:
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


2. 使用web.xml的<servlet>方式引入并初始化ApplicationContext:
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>


3. 在struts-config.xml中以<plug-in>引入并初始化ApplicationContext:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
 <set-property
  property="contextConfigLocation"
  value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml" />
</plug-in>

 


二.struts引入spring的ApplicationContext后,如何在struts的Action中使用ApplicationContext??
1. 如果使用web.xml的<servlet>或者<listener>方式引入并初始化ApplicationContext的,
因配置文件的位置就写在web.xml的参数contextConfigLocation中,所以获取了servletContext就行了,
在struts的action中获取ApplicationContext的方法如下:
WebApplicationContext wac
 = WebApplicationContextUtils.getWebApplicationContext(
          request.getSession().getContext()
   );

2. 但如果是在struts-config.xml中以<plug-in>引入并初始化ApplicationContext的,
其实质是spring为struts提供的一个ContextLoaderPlugIn类,此类也可以加载context的xml文件。
因为配置文件的位置不是写在web.xml中,而在struts-config.xml中,引而不能直接使用上面的方法,但是也需要获取了servletContext,
那么,在struts的action中获取ApplicationContext的方法如下:
WebApplicationContext context
 = (WebApplicationContext)this.getServlet().getServletContext()
 .getAttribute("org.springframework.web.struts.ContextLoaderPlugIn.CONTEXT.");

3.在以上三种方式下都适用的方法:
applicationContext app
 =new classpathXmlApplicationContext("applicationContext.xml")
  

 

 三.比较和小结:
1. 第一,二种方法的区别在于,两种方式加载的WebApplicationContext,以不同的Key存放在ServletContext中。而如果你定义了HibernateFilter的话,spring会利用WebApplicationContextUtils来获取WebApplicationContext,而此类并不识别ContextLoaderPlugIn类所加载的上下文,此时便会抛出异常: No WebApplicationContext found: no ContextLoaderListener registered?利用ContextLoaderListenter来加载dao、service级别的context,而对于struts的action,用ContextLoaderPlugIn加载。


2. 第三种方法的缺点很明显, 指明配置文件所在,耦合性增强了.


3. 有人可能会怀疑第三种情况效率是否会低,因为第三种方法以配置文件为参数,是否意味着每次都会重新从XML文件中加载所有的bean,但事实上不是这样.spring的设计就是要在启动的时候加载配置文件,当web中再无论是用applicationContext或者是WebApplicationContext获得beans时都不会重新加载配置文件.

 

 4.

虽然上述实现了在action中使用ApplicationContext,但是这样做,和继承spring提供的ActionSupport类没什么区别,因为这样做,同样是引入了spring的类,至少也引入了ApplicationContext类,同样是使得Struts与Spring紧密耦合,而且action中引入ApplicationContext目的是获取Spring管理的bean,这样子,action类也负责了查找Spring管理的bean,这违背了控制反转(IOC)的原则。所以一般情况下,不要在Action中引入ApplicationContext。

建议采用另一种Struts-Spring集成方式,即使用Spring的DelegatingActionProxy代理类,利用IOC将你想使用的bean以注入到Action中,而不是在Action中使用ApplicationContext获取你想要的bean。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值