Spring和Struts1的整合是我们经常会使用的,因为我把整合的步骤大致的总结一下,主要是包含各种整合的方法以及每一种方法的利弊。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
为了可以让这个监听器来加载Spring的配置文件,还需要指定Spring配置文件的位置。
<context-param>
</context-param>
当然这个就是默认的值,如果你的配置文件正好放在这个位置,也正好叫这个名字就可以不用配置这个初始化参数,我建议最好配置一下,这样有利于维护。通过这样配置就可以使用Web容器来启动Spring容器了,那么我们怎么来获取这个ApplicationContext对象呢。这个监听器就是来产生这个ApplictionContext对象的,产生了以后将这个对象放在ServleContext作用域中,只要的这个这个对象的存储时的键值就可以在Servlet来获取这个ApplicationContext对象了。通过查看Spring的源码可以查看到这个键值WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,有了这个就可以很容易的得到这个对象了。即:ApplicationContextapplicationContext=(ApplicationContext)this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
但是这样来获取未免有些太麻烦了,谁会记得这个键值啊。因此Spring提供了另外的实现方案。Spring中提供了一个这样的工具类WebApplicationContextUti
<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的配置文件的地址,默认情况下,该插件会利用 web.xml 文件中注册的 ActionServlet 实例的名称加上 –serlvet.xml 后缀作为文件名.如果想要另外加载一个 Bean 配置文件, 可以在 contextConfigLocation 属性中指定文件名. 但此时需通过servlet 配置 Spring 容器随 Web 应用的启动而初始化. 而不适用 Listener配置。同样再Action的代码中使用前面的那种方式来访问ApplicationContext对象就可以了,只是这时候获取的ServletContext的方式不一样了。仅仅配置这个插件也是不够的,还需要配置一个Servlet,ContextLoaderServlet让这个Servlet随着这个服务器的启动来启动,如下就可以实现了
<servlet>
<servlet-name>contextLoader</servlet-name>
还有一种实现就是Spring 提供了一个 ActionSupport 对象, 这是 Action 类的一个子类, 通过它的getWebApplicationContext
下面就介绍第二种解决方案,使用Spring容器来管理Action和普通的Bean一样,一样使用Spring提供的依赖注入。在Spring 的应用程序上下文中声明 Struts 的 Action 对象, 使用Spring 的依赖注入来注入 Spring应用程序上下文的其他 Bean。
首先我们还是需要注册我们使用的监听器ContextLoaderListener以及指定Spring配置文件的初始化参数。然后在Struts-config.xml文件中注册一个<controller>元素,例如:
<controller>
</controller>
然后在配置Action节点的时候不需要指定type就可以,然后在Spring的配置文件中和配置普通的Bean一样来进行配置,然后注入所依赖的Bean就可以了,然后在Action的excute方法中就可以直接使用这个依赖的Bean了,在applicationContext.xml 中声明 Struts Action 要求该Bean 的 name 必须和它在 struts-config.xml文件中的路径一致. 因为该 <bean> 元素的 id属性不能包含 / 字符, 所以应该用 name属性代替。这样就可以使用Spring配置的方式来实现是否需要单例处理,对于一些线程安全问题可以很好的解决了。这样在Struts里就不会依赖Spring的API了,Struts根本就感觉不到Spring的存在了,可见这得益于我们配置的这个<controller>元素了,这个元素究竟是干嘛的的。我查看了一下他的官方的文档。这是官方文档上的一段话:
The <controller>
element allows you to configure the ActionServlet. Many of thecontroller parameters were previously defined by servletinitialization parameters in your web.xml
file buthave been moved to this section of struts-config.xml
in order to allow different modules in the same web application tobe configured differently. For full details on available parameterssee the struts-config DTDDoc or the listbelow.这段话的意思就是我们可以在struts-config.xml这个文件中通过使用<controller>
element来配置ActionServlet的属性,那么我们在这里配置的属性是processorClass,也就是要拦截默认的处理的请求使用Spring提供的这个DelegatingRequestProcess
联系客服