知识大全 spring在web.xml中和在struts中的不同配置

Posted

篇首语:有时候总感觉别人忽略了自己,想想可能是自己太闲了。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 spring在web.xml中和在struts中的不同配置相关的知识,希望对你有一定的参考价值。

  Spring中WebApplicationContext的研究

  ApplicationContext是Spring的核心 Context我们通常解释为上下文环境 我想用 容器 来表述它更容易理解一些 ApplicationContext则是 应用的容器 了:P Spring把Bean放在这个容器中 在需要的时候 用getBean方法取出 虽然我没有看过这一部分的源代码 但我想它应该是一个类似Map的结构

  在Web应用中 我们会用到WebApplicationContext WebApplicationContext继承自ApplicationContext 先让我们看看在Web应用中 怎么初始化WebApplicationContext 在web xml中定义:

  <context param>

  <param name>contextConfigLocation</param name>

  <param value>/WEB INF/applicationContext xml</param value>

  </context param>

  <listener>

  <listener class> sprntext ContextLoaderListener</listener class>

  </listener>

  <! OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER

  <servlet>

  <servlet name>context</servlet name>

  <servlet class> sprntext ContextLoaderServlet</servlet class>

  <load on startup> </load on startup>

  </servlet>

   >

  可以看出 有两种方法 一个是用ContextLoaderListener这个Listerner 另一个是ContextLoaderServlet这个Servlet 这两个方法都是在web应用启动的时候来初始化WebApplicationContext 我个人认为Listerner要比Servlet更好一些 因为Listerner监听应用的启动和结束 而Servlet得启动要稍微延迟一些 如果在这时要做一些业务的操作 启动的前后顺序是有影响的

  那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?

  以ContextLoaderListener为例 我们可以看到

  public void contextInitialized(ServletContextEvent event)

  ntextLoader = createContextLoader();

  ntextLoader initWebApplicationContext(event getServletContext());

  

  protected ContextLoader createContextLoader()

  return new ContextLoader();

  

  ContextLoader是一个工具类 用来初始化WebApplicationContext 其主要方法就是initWebApplicationContext 我们继续追踪initWebApplicationContext这个方法(具体代码我不贴出 大家可以看Spring中的源码) 我们发现 原来ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了ServletContext中 ServletContext也是一个 容器 也是一个类似Map的结构 而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 我们如果要使用WebApplicationContext则需要从ServletContext取出 Spring提供了一个WebApplicationContextUtils类 可以方便的取出WebApplicationContext 只要把ServletContext传入就可以了

  上面我们介绍了WebApplicationContext在Servlet容器中初始化的原理 一般的Web应用就可以轻松的使用了 但是 随着Struts的广泛应用 把Struts和Spring整个起来 是一个需要面对的问题 Spring本身也提供了Struts的相关类 主要使用的有 springframework web struts ActionSupport 我们只要把自己的Action继承自ActionSupport 就是可以调用ActionSupport中getWebApplicationContext()的方法取出WebApplicationContext 但这样一来在Action中 需要取得业务逻辑的地方都要getBean 看上去不够简洁 所以Spring又提供了另一个方法 用 springframework web struts ContextLoaderPlugIn 这是一个Struts的Plug 在Struts启动时加载 对于Action 可以像管理Bean一样来管理 在struts config xml中Action的配置变成类似下面的样子

  <action attribute= aForm name= aForm path= /aAction scope= request   type= springframework web struts DelegatingActionProxy >

  <forward name= forward path= forward jsp />

  </action>

  注意type变成了 springframework web struts DelegatingActionProxy 之后我们需要建立action servlet xml这样的文件 action servlet xml符合Spring的spring beans dtd标准 在里面定义类似下面的

  <bean name= /aAction class= web action Aaction singleton= false >

  <property name= businessService >

  <ref bean= businessService />

  </property>

  </bean>

   web action Aaction是Action的实现类 businessService是需要的业务逻辑 Spring会把businessService注入到Action中 在Action中只要写businessService的get和set方法就可以了 还有一点 action的bean是singleton= false 即每次新建一个实例 这也解决了Struts中Action的线程同步问题 具体过程是当用户做 /aAction 的HTTP请求(当然应该是 /aAction do ) Struts会找到这个Action的对应类 springframework web struts DelegatingActionProxy DelegatingActionProxy是个代理类 它会去找action servlet xml文件中 /aAction 对应的真正实现类 然后把它实例化 同时把需要的业务对象注入 然后执行Action的execute方法

  使用了ContextLoaderPlugIn 在struts config xml中变成类似这样配置

  <plug in className= springframework web struts ContextLoaderPlugIn >

  <set property property= contextConfigLocation value= /WEB INF/applicationContext xml /WEB INF/action servlet xml />

  </plug in>

  而在web xml中不再需要ContextLoaderListener或是ContextLoaderServlet

  说到这里不知道大家会不会有这样的问题 如果使用ContextLoaderPlugIn 如果我们有些程序是脱离Struts的Action环境 我们怎么处理 比如我们要自定义标记库 在标记库中 我们需要调用Spring管理的业务层逻辑对象 这时候我们就很麻烦 因为只有在action中动态注入业务逻辑 其他我们似乎不能取得Spring的WebApplicationContext

cha138/Article/program/Java/ky/201311/28290

相关参考

知识大全 一个struts2和spring2的整合

  在Struts中整合Spring的IoC支持是一件十分简单的事情让我们一步一步来实现   )复制strutsspringpluginxxxjar和相应的springj

知识大全 构建基于Web/XML的信息集成研究

构建基于Web/XML的信息集成研究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要在当前的

知识大全 解析web.xml中在Servlet中获取context-param和init-param内的参数

解析web.xml中在Servlet中获取context-param和init-param内的参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜

知识大全 spring 整合strut2

Spring整合Struts    虽然Spring也提供了自己的MVC组件但一来Spring的MVC组件过于繁琐二    来Struts的拥护者实在太多因此很

知识大全 Web XML编程之显示XML文件内容

WebXML编程之显示XML文件内容  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  XML技术越

知识大全 spring struts2 ibatis框架整合开发

这里主要介绍一下spring+struts+ibatis所需要的jar包文件spring所需包  以上包为spring配置基本包ibatis所需包  有解决方法的朋友们希望能回复  与struts整合

知识大全 struts2 + spring + hibernate&

   struts释出已经很久了虽然自己现在作GUI开发不过有时间还是学习下web开发现在就将我使用myeclipse工具应用struts+spring+hibernat

知识大全 Struts整合spring方法(三)

Struts整合spring方法(三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Sprin

知识大全 Spring和Struts的区别

Spring和Struts的区别?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz

知识大全 Struts+Spring+Hibernate快速入门

Struts+Spring+Hibernate快速入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧