一、集成时需要考虑的问题:
Spring与第三方MVC框架集成时,需要考虑的问题是如何在第三方MVC框架中访问Spring IOC容器管理的Bean,或者说,如何获取Spring IOC容器的实例。我们还要保证在第三方MVC框架开始处理用户请求之前,Spring的IOC容器必须初始化完毕。
二、自动加载Spring的IOC容器的两种方式
1、利用第三方框架的扩展点,实现加载Spring的IOC容器,例如,Struts就提供了Plugin扩展。
2、第二种方式是在web.xml中定义Lisenter或Servlet,让Web应用程序一启动就自动加载Spring的IOC容器。这种方式较为通用,对于一些不太常见的第三方MVC框架也可以用这种方式来尝试与Spring集成。
这里需要注意,如果正在使用基于Servlet 2.3或更高规范的Web服务器,则应当使用Spring提供的ContextLoaderListener来加载IOC容器,因为根据Servlet2.3规范,所有的Listener都会在Servlet被初始化之前完成初始化。由于我们希望尽可能早地完成Spring IOC容器的初始化,因此采用ContextLoaderListener加载Spring的Ioc容器是最适合的,这时在web.xml中定义如下:
...
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
...
默认的,ContextLoaderListener会在/WEB-INF/目录下查找名为applicationContext.xml文件,作为Spring的XML配置文件加载。如果使用其他文件名,或者有多个XML配置文件,就需要预先在web.xml文件中的<context-param>标签中指定。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/spring/applicationContext.xml
/WEB-INF/config/spring/datasource.xml
/WEB-INF/config/spring/serviceBean.xml
/WEB-INF/config/spring/actionBean.xml
</param-value>
</context-param>
如果正在使用的Web服务器还不支持Servlet 2.3规范,则无法使用Listener,也就无法通过ContextLoaderListener来加载Spring的IOC容器。为些Spring提供了另一个ContextLoaderServlet来加载Spring的IOC容器。
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
由于必须加载ContextLoaderServlet,然后再加载其他的Servlet,才能保证Spring的IoC容器在其他Servlet处理用户请求之前初始化完毕,因此,需设置<load-on-startup>为0,表示Web服务器一启动就加载ContextLoaderServlet,其他的Servlet的<load-on-startup>值应设得大一些,保证ContextLoaderServlet有足够的时间初始化Spring的IOC容器。
一旦完成了Spring IOC容器的加载,就可以通过Spring提供的一个辅助类WebApplicationContextUtils来获得Spring IOC容器的实例了。
ApplicationContext ctx=
WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
三、Spring与Struts的集成
方式一:
第一种方案是通过Spring提供的一个Struts插件来初始化IOC容器,然后从Spring提供的ActionSupport派生所有的Aciton,以便能通过 getWebApplicationContext获得Spring IOC容器中所有Bean的实例。
1、 在Struts配置文件的最后添加Spring插件声明:
<struts-config>
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”/>
</struts-config >
然后设计一个BaseAction,其中定义了获得业务逻辑接口的方法,其他所有的Action都从BaseAction派生即可非常方便地调用业务逻辑接口,比如。
public class BaseAction extends ActionSupport{
public Object getBean(String beanName){
return (Object) getWebApplicationContext().getBean(beanName);
}
}
这样,BaseAction就可以随时通过Spring的ApplicationContext获得逻辑组件的引用,所有的Action子类都可以直接通过getBean(String beanName)获得指定组件。
最后一步是编写Spring的XML配置文件,在此配置文件中定义所有的Bean组件,但不包括Struts的Action实例。
<beans>
<bean name="userService" class="com.springTest.UserServiceImpl"
</bean>
...
</beans>
如果Spring的XML配置文件没有使用默认的文件名,就必须在Struts配置文件中声明Plugin时指定文件位置。
<struts-config>
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
<set-property property="contextConfigLocation" value="/WEB-INF/config/spring/mySpringConfig.xml "/>
</plug-in>
</struts-config >
这种方式集成Spring和Struts时,如果合理地抽象出一个类似BaseAction的类作为所有Action类的超类,在集成到Spring时,只需将BaseAction的超类从Struts的Action类改为Spring提供的ActionSupport,然后在Struts中声明Spring的Plugin,就可以在不修改任何Action的情况下实现和Spring的集成。
方式二:
第二种集成Struts的方案是将Struts的所有Action都作为Spring IOC容器中的Bean来管理,然后通过Spring提供的DelegatingRequestProcessor来替代Struts的默认派发器,以便让Spring能截获派发给Action的请求。在这种方式下,业务逻辑组件通过依赖注入的方式在Spring的IOC容器中就配置完毕了。
设计一个BaseAction,其中定义了获得业务逻辑接口的方法,其他所有的Action都从BaseAction派生即可非常方便地调用业务逻辑接口,比如。
public class BaseAction extends Action{
private UserService userService;
public void setUserService(UserService userService){
this.userService=userService;
}
public UserService getUserService(){
return userService;
}
}
在Struts配置文件的最后添加Spring提供的DelegatingRequestProcessor和插件声明:
<struts-config>
...
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn" />
</struts-config >
同理,如果Spring的XML配置文件没有使用默认的文件名,就必须在Struts配置文件中声明Plugin时指定文件位置。
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
<set-property property="contextConfigLocation" value="/WEB-INF/config/spring/mySpringConfig.xml "/>
</plug-in>
Spring提供的Struts插件仍负责启动Spring容器,而DelegatingRequestProcessor可以让Spring接管请求,从而将请求派发到IOC容器管理的Action实例。为此,在Spring的XML配置文件中,除了定义业务逻辑和其他组件外,还必须声明每一个Action类,其name属性和Struts配置文件中的path要完全一致。假设在Struts配置文件中配置了两个Action:
<action-mappings>
<action path="/login" type="com.struts.LoginAction"
name="loginForm" scope="request" validate="true" input="/login.jsp">
<forward name="success" path="/hello.jsp" />
<forward name="failure" path="/login.jsp" />
</action>
<action path="/logout" type="com.struts.LogoutAction">
<forward name="success" path="/login.jsp" />
</action>
</action-mappings>
则在Spring的配置文件中,除了定义UserService组件外,还必须定义两个Action,并且要和Struts配置文件中的Action一一对应。
<bean id="userService" class="com.testSpring.UserServiceImpl" />
<bean name="/login" class="com.struts.LoginAction">
<property name="userService" ref="userService" />
</bean>
<bean name="/logout" class="com.struts.LogoutAction">
<property name="userService" ref="userService" />
</bean>
实际上,使用这种方式实现集成,Struts配置文件中Action的type属性将被忽略,因为Spring会根据path属性查找对应name的Action Bean。但是,仍然建议将type属性标识出来,便于查看URL和Action的关联。使用这种方式时,由于Action被作为Bean纳入Spring的IOC容器管理,因此,可以获得完全的依赖注入能力。不过,最大的不便是所有的Action必须同时在Spring配置文件和Struts配置文件中各配置一次。
具体选择哪种方式集成要看具体应用,个人认为第二种比较常用。
分享到:
相关推荐
### Struts与Spring:两种MVC框架的比较 在Java Web开发领域中,MVC(Model-View-Controller)架构模式被广泛应用于构建灵活、可维护的Web应用程序。本文将对比分析Struts与Spring这两种流行的MVC框架,帮助开发者...
Spring集成Struts与Hibernate入门详解 Spring框架是Java平台上一个开源的轻量级框架,它提供了许多功能强大且灵活的模块,以帮助开发者快速构建企业级应用程序。Struts是Apache软件基金会的一个开源项目,提供了一...
【Struts MVC框架详解】 Struts是Apache软件基金会Jakarta项目的一个重要组成部分,由Craig R. McClanahan主导设计和开发。作为Java Web MVC框架的先驱,Struts在过去五年间逐渐成熟,成为市场占有率最高的MVC框架...
在本资源中,"struts2 spring hibernate框架技术与项目实战 光盘源码 上"提供了这三大框架的实践项目代码,帮助开发者深入理解并掌握它们的集成与应用。 Struts2作为MVC(模型-视图-控制器)框架,主要负责处理HTTP...
SpringMVC与其他WebMVC框架如Struts2相比,具有一些显著的优点。例如,它天然支持REST风格的URL,同时拥有更为灵活的处理流程和更好的测试支持。此外,SpringMVC可以无缝整合Spring框架的其他组件,如Spring ...
在Java Web开发中,JPA(Java Persistence API)、Spring框架和Struts框架是常见的三大组件,它们分别负责数据持久化、依赖注入与控制层管理。将这三个组件集成在一起可以构建出高效、稳定的企业级应用。下面,我们...
- **struts2-spring-plugin**: 与Spring框架集成,实现依赖注入。 - **struts2-config-browser-plugin**: 提供图形化配置浏览器,方便查看和调试配置。 3. **MVC模式** - Model:业务逻辑模型,处理数据。 - ...
【Spring MVC 框架详解】 Spring,由 Rod Johnson 在其著作《Expert One-on-One J2EE Design and Development》中提出的设计理念实现,是一个全面的、模块化的应用框架。Spring MVC 是 Spring 框架的一部分,它提供...
##### 第一部分:Web工程集成Struts2框架 **Step01:创建Web工程** - 在开发环境中创建一个新的Web工程,如Eclipse或IntelliJ IDEA中通过New -> Web Project创建。 **Step02:完成Web工程与Struts2的整合开发** -...
4. **集成性**:Spring MVC 完美地集成到 Spring 生态系统中,使得与其他 Spring 组件如 Spring Security、Spring Data 的整合变得非常容易。 #### 二、Spring MVC 核心组件 Spring MVC 的核心组件包括但不限于: ...
### SSH(Struts1.0+Spring+Hibernate)框架集成笔记 #### 一、概述 SSH框架集成,即Struts1.0 + Spring + Hibernate框架的整合应用,是Java Web开发中较为复杂的集成模式之一。它集合了MVC设计模式(通过Struts...
### Spring集成Struts与Hibernate详解 #### Spring集成Struts **背景介绍** 随着Java技术的发展,Struts作为最早的MVC框架之一,在Java EE领域中占据了重要地位。虽然随着时间的推移,新的框架和技术不断涌现,但...
【SSM框架集成详解】 在Java Web开发领域,Spring、Struts2和MyBatis是三个非常重要的组件,它们各自负责不同的职责,并通过巧妙的整合,构建出强大的企业级应用框架。本案例主要讲解如何将这三大框架集成,实现...
### Struts2+Hibernate+Spring三大框架技术 #### Struts2 框架技术 **MVC概述** MVC(Model-View-Controller)是一种软件架构设计模式,它将应用程序分为三个基本部分:模型(Model)、视图(View)与控制器...
### Spring、Struts、iBatis框架搭建流程详解 #### 一、框架下载与准备 在构建基于Spring、Struts和iBatis的项目时,首先需要下载这些框架的最新版本,并进行相应的准备工作。 ##### 1. Struts2框架 Struts2是一...
《构建摄影平台:Spring+Spring MVC+Struts+Hibernate整合详解》 在现代Web开发领域,Spring框架以其灵活性和强大的企业级应用支持而备受青睐。本项目“Spring+Spring MVC+Struts+Hibernate开发摄影平台完整版系统...
### Struts+Hibernate+Spring+三个框架简介 #### 一、Struts框架详解 **Struts** 是一个基于 Java 的开源框架,它主要用于构建 Web 应用程序,并且遵循 MVC(Model-View-Controller)设计模式。Struts 架构清晰,...
《SSM框架整合详解——基于spring-mybatis-struts2-master的实战分析》 在Java Web开发领域,SSM(Spring、Struts2、MyBatis)框架的组合被广泛使用,因其灵活性和强大的功能而备受青睐。本篇文章将深入探讨这个...
Struts 2、Hibernate 和 Spring 是Java开发中最流行的三大开源框架,它们的整合使用被称为SSH(Struts2、Spring、Hibernate)集成开发。这三大框架分别解决了Web应用中的不同问题,Struts 2负责表现层,Spring处理...