为了在Struts中加载Spring context,需要在struts-config.xml文件中加入如下部分:
<struts-config>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
第一种方法:
通过Struts的plug-in在Struts和Spring之间提供了良好的结合点。通过plug-in我们实现了Spring context的加载,不过仅仅加载Spring context并没有什么实际的意义,还应该经过配置将Struts的Action交给Spring容器进行管理。
<action-mappings>
<action path="/login"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm">
<forward name="success" path="/main.jsp" />
<forward name="failure" path="/login.jsp" />
</action>
在form bean这个节点上与传统的Struts配置没有什么区别,而在Action上面则发生了变化。在传统的action节点上type属性写入action类的完整类名,而和Spring结合后在这点上是使用了Spring提供的DelegatingActionProxy作为action的type属性,DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将把调用请求转交给真正的Action实现。通过这样的方式,Spring获得了Action实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。这样,就可以将Action看作是Spring的一个bean,它就可以享受Spring的所有服务,如依赖注入、实例管理、事务管理等。
在applicationContext.xml中相应的配置如下的节点:
<beans>
.......
<bean name="/login" class="net.xiaxin.action.LoginAction"
singleton="false">
<property name="userDAO">
<ref bean="userDAOProxy" />
</property>
</bean>
</beans>
最后这个bean的配置是关键,这个名为“/login”的bean与Struts中的
<action path="/login" ……>
……
</action>节点相对应,这样,Spring Bean Name与Struts Action Path相关联,当Struts加载对应的Action时,DelegatingActionProxy就根据传入的path属性,在Spring Context寻找对应bean,并将其实例返回给Struts。与此同时,还可以看到,"/login" bean 中包含了一个userDAO 引用,Spring 在运行期将根据配置为其提供userDAO 实例,以及围绕userDAO 的事务管理服务。这样一来,对于Struts 开发而言,我们既可以延续Struts 的开发流程,也可以享受Spring 提供的事务管
理服务。而bean 的另外一个属性singleton="false",指明了Action 的实例获取方式为每次重新创建。这也解决了Struts中令人诟病的线程安全问题。
第二种方法:
为了在 struts-config.xml 文件中配置 DelegatingRequestProcessor,你需要重载 <controller> 元素的 “processorClass” 属性。 下面的几行应该放在 <action-mapping> 元素的后面。
<controller>
<set-property property="processorClass"
value="http://www.zhmy.com/org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
增加这些设置之后,不管你查询任何类型的 Action,Sping都自动在它的context配置文件中寻找。 实际上,你甚至不需要指定类型。下面两个代码片断都可以工作:
<action path="/user" type="com.whatever.struts.UserAction"/>
<action path="/user"/>
如果你使用 Struts 的 modules 特性,你的 bean 命名必须含有 module 的前缀。 举个例子,如果一个 Action 的定义为 <action path="/user"/>,而且它的 module 前缀为“admin”, 那么它应该对应名为 <bean name="/admin/user"/> 的 bean
如果你在 Struts 应用中使用了 Tiles,你需要配置 <controller> 为 DelegatingTilesRequestProcessor。
如果第二种方法不行,再用第一种方法。
至此,SS组合已经将Struts MVC以及Spring中的Bean管理、事务管理融为一体。如
果算上userDAO 中的Hibernate 部分,我们就获得了一个全面、成熟、高效、自顶而下的
Web 开发框架。
Struts+Spring整合方式
struts与spring整合方式有三种:
方式一:通过Spring的ActionSupport类实现。
方式二:通过Sping的DelegatingRequestProcessor类实现。
方式三:通过Sping的DelegatingActionProxy类实现。
相同点:以上三种方式都需要在struts的配置文件struts-config.xml中注册spring的ContextLoaderPlugIn插件。即:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
不同点:
使用Spring提供的ActionSupport类,只需要使用Action继承Spring的ActionSupport类,即可实现Spring与struts的整合,使用起来简单方便,但是struts的Action与Spring耦合在一起,并且Struts的Action不在spring的控制之中,这样如果更换别的IOC容器,或想使用Spring的AOP都是比较困难的,而且如果是多个动作放在一个Action中,则这种方式就无能为了了!
使用Spring的DelegatingRequestProcessor类,需要在Struts的配置文件中,使用DelegatingRequestProcessor代替Struts的RequestProcessor类,并在Spring的配置文件中动作映射对应的Bean,可以很方便的转换而不用修改代码,这种方式的缺点是依赖于Struts的RequestProcessor类。
使用Spring的DelegatingActionProxy类,需要在Struts的配置文件中,定义动作映射的type属性为DelegatingActionProxy而不是类的实际名称,并在Spring的配置文件中定义和Struts配置文件动作映射对应的Bean,这种方式和Struts耦合性最小。
注:三者中,使用Spring的DelegatingActionProxy类来整合Spring和Struts的方式最为强大和灵活。
关于Spring , Struts结合学习。
一、前言
刚刚接触了日本一个项目,用的框架名称是Northland Framework,主要用到以下部分
Struts、Spring、iBATIS、Velocity。Struts、Spring如何结合在一起?
二、Spring提供了三种整合Struts的方法:
使用 Spring 的 ActionSupport 类整合 Structs
使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor
将 Struts Action 管理委托给 Spring 框架
(参见Get a better handle on Struts actions, with Spring
http://www-128.ibm.com/developerworks/java/library/j-sr2.html?ca=drs-tp4105
对应还有译文:
http://gocom.primeton.com/modules/techresource/article504.htm?utm_campaign=searchengine&utm_source=baidu&utm_medium=jjpm&utm_term=Spring+Struts)
三、我只关心第三种整合方法:
这种方法通过Spring提供的两个和Struts相关类来实现:org.springframework.web.struts. DelegatingActionProxy,org.springframework.web.struts. ContextLoaderPlugIn。
ContextLoaderPlugIn实现Struts的PlugIn接口,只要在struts-config.xml中有如下配置:
<action path="/searchSubmit">
type="ca.nexcel.books.actions.DelegatingActionProxy"
input="/searchEntry.do"
validate="true"
name="searchForm">
<forward name="success" path="/WEB-INF/pages/detail.jsp"/>
<forward name="failure" path="/WEB-INF/pages/search.jsp"/>
</action>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>
ActionServlet装载的时候就可以顺便装载和Spring相关的beans.xml,和beans.xml中相关的一个东西叫做WebApplicationContext , (在Spring里关键就是取得WebApplicationContext,取得这个也就可以用Spring管理业务),在ContextLoaderPlugIn中是这样保存WebApplicationContext:
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
再看DelegatingActionProxy,它继承于Struts的Action,以后struts-config.xml中所有的
Action-mapping都要指向它,只是每个Action-mapping的path不同,将来也是用这个path来区分究竟需要执行beans.xml中的那个类。如下代码:
public ActionForward execute(){
Action delegateAction = getDelegateAction(mapping);
return delegateAction.execute(mapping, form, request, response);
}
这里的delegateAction就是beans.xml中一个相关的类(beans.xml也要求类继承于Struts的Action) 去看看怎么得到delegateAction:
protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
WebApplicationContext wac = getWebApplicationContext(getServlet(),
mapping.getModuleConfig());
String beanName = determineActionBeanName(mapping);
return (Action) wac.getBean(beanName, Action.class);
}
是如何取得WebApplicationContext呢:
wac=(WebApplicationContext)actionServlet.getServletContext().getAttribute( ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX);
SERVLET_CONTEXT_PREFIX 正是 前边提到的ContextLoaderPlugIn中 的attrName。
现在这个原理一目了然,ContextLoaderPlugIn在actionServlet初始化过程中保存
起来留到后面供DelegatingActionProxy用。
四、在另一篇文章中提到在上面的方法中OpenSessionInView Filter不能用
(参照http://wyyhzc.itpub.net/),这个东西我也不熟悉,是不是有不少Spring的东西在这种方式中都不能用呢? 这就说到另一种取得Spring WebApplicationContext的方法:
在web.xml中配置ContextLoaderListener:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/beans.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
对应的beans.xml和前边那个一样,Log4jConfigListener先不用管,去查看相关文档。
Web服务启动的时候,我们去看看ContextLoaderListener作了什么:
WebApplicationContext = createWebApplicationContext(servletContext, parent);
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
同样是保存WebApplicationContext,但是key是ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
怎么才能不用ContextLoaderPlugIn而只用ContextLoaderListener?下面我修改
org.springframework.web.struts. DelegatingActionProxy 把它修改成
ca.nexcel.books.actions. DelegatingActionProxy并且修改一下代码:
修改getWebApplicationContext方法
Return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet,
moduleConfig); 换成下边方法
ServletContext sc = actionServlet.getServletContext();
WebApplicationContext wac = null;
wac = WebApplicationContextUtils.getWebApplicationContext(sc);
return wac;
并且在struts-config.xml中将action的type指向自己的
ca.nexcel.books.actions. DelegatingActionProxy,PlugIn删除web.xml加上刚才提到的Listener,启动tomcat运行一切正常。
五、我把northland的配置文件贴出来。
Struts-config.xml:
<action-mappings>
<action
path="/list"
input="/list.jsp"
name="_list"
scope="request"
type="jp.co.nec.hnes.northland.web.struts.FlowAction"
>
<display-name>一覧画面</display-name>
</action>
<action
path="/register"
input="/register.jsp"
name="_register"
scope="request"
type="jp.co.nec.hnes.northland.web.struts.FlowAction"
>
<display-name>登録画面</display-name>
</action>
Web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:flowConfig.xml,
classpath:viewConfig.xml,
classpath:applicationContext.xml,
classpath:applicationContext-extra.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet>
从中可以看到
其中的jp.co.nec.hnes.northland.web.struts.FlowAction和
ca.nexcel.books.actions. DelegatingActionProxy的功能差不多。
分享到:
相关推荐
在Ibatis Spring Struts整合中,Spring通常作为核心框架,管理其他组件的生命周期,包括Struts的Action和Ibatis的SqlSession。开发者可以利用Spring的AOP功能来管理事务,确保在多条数据库操作之间保持一致性。...
Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...
Spring 和 Struts2 是两个...总之,Spring 和 Struts2 的整合利用了两者的优势,提供了一种强大的方式来构建可扩展、易于维护的 Java Web 应用。通过深入学习和实践,开发者可以掌握这种整合技巧,并在实际项目中应用。
### Spring与Struts整合的三种主要方式 在Java Web开发领域,Spring框架和Struts框架都是非常重要的技术。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能,为Java应用提供了轻量级的解决方案。而...
2. **Spring MVC与Struts2的集成**:虽然两者都有MVC模式,但在整合时,通常会使用Struts2来处理请求的路由和响应,而Spring MVC则处理更复杂的视图解析和数据绑定。 3. **Spring事务管理**:Spring提供了强大的...
Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,而Struts2则以其优秀的MVC设计模式著称,两者整合可以构建出高效、可维护的Web应用。下面将详细介绍Spring与Struts2整合的相关知识点。 **一、整合背景*...
Spring与struts整合主要有三种方式,通过Spring的ActionSupport类,通过Spring的DelegatingRequestProcessor类、通过Spring的DelegatingActionProxy类。
《Spring+Struts+Hibernate整合开发》是一本深入讲解企业级Java应用开发的书籍,它主要聚焦于三大著名开源框架——Spring、Struts和Hibernate的集成与应用。这些框架是Java Web开发中的基石,广泛应用于各种复杂的...
Spring 和 Struts 整合是企业级 Java 应用开发中常见的技术组合,它们各自在应用程序架构中扮演着重要的角色。Spring 提供了依赖注入(DI)和面向切面编程(AOP),而 Struts 则是一个经典的MVC框架,用于处理用户...
将Spring与Struts整合可以充分利用两者的优点,提高开发效率和应用的可维护性。 整合Spring和Struts的过程主要包括以下几个关键步骤: 1. **环境准备**:首先,确保你的开发环境中已经安装了Java、Eclipse或...
通过以上步骤,你就能完成一个基本的JPA+Spring+Struts整合应用。这种整合方式能充分利用每个框架的优点,提高代码的可维护性和可扩展性,降低开发复杂度。在实际项目中,你可能还需要考虑异常处理、安全控制、性能...
### Spring与Struts的整合:实现灵活的企业级应用开发 在企业级应用开发领域,Spring框架和Struts框架都是极具影响力的技术。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,提供了良好的环境管理和...
《Spring 3.2.6、Struts 2.3.15与MyBatis 3整合实战详解》 在Java Web开发领域,Spring、Struts和MyBatis是三大主流框架,它们各自承担着不同的职责,共同构建了一个强大的企业级应用开发环境。本DEMO以Spring ...
接下来,我们将详细探讨Spring和Struts整合开发中的关键知识点。 1. **Spring框架**:Spring的核心特性包括DI(依赖注入)和AOP(面向切面编程)。DI使得对象之间的关系在配置文件中定义,而不是硬编码在代码里,这...
本文将基于"spring+struts2整合源码"的标题和描述,详细讲解Spring和Struts2的整合过程,以及整合过程中涉及的关键知识点。 首先,Spring和Struts2整合的主要目的是实现业务逻辑层和表现层的解耦,提高代码的可测试...
在本文中,我们将探讨如何在MyEclipse环境中整合Spring和Struts2框架,这对于初学者来说是一个重要的学习步骤。整合这两个框架可以创建一个强大的MVC架构,方便地管理业务逻辑和服务层。以下是如何进行环境搭建和...
Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子
Struts2 和 Spring 整合是Java开发中常见的实践,主要目的是为了利用Spring的强大功能,如依赖注入(DI)和面向切面编程(AOP),同时保持Struts2的MVC架构的优势。以下是对整合过程的详细说明: 首先,Spring框架...
总的来说,整合Spring和Struts编写多页面用户注册模块涉及到的主要知识点有:Spring的DI和AOP,Struts的MVC架构,Action和Result的配置,以及JSP或模板引擎的使用。通过这样的整合,我们可以构建出一个灵活、可扩展...
整合Spring和Struts 2的主要目的是将Spring的依赖注入和管理能力引入到Struts 2的Action中,以及利用Spring的AOP进行事务管理。整合步骤通常包括以下几个部分: 1. **添加依赖**:在项目中引入Spring和Struts 2的库...