`
zengbo0710
  • 浏览: 414727 次
社区版块
存档分类
最新评论

整合Struts 与Spring

阅读更多
1、使用 Spring 的 ActionSupport 类整合 Structs
2、使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的
RequestProcessor
3、将 Struts Action 管理委托给 Spring 框架

首先要建立"装载应用程序环境"
无论您使用哪种技术,都需要使用 Spring 的
ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring
应用程序环境。就像添加任何其他插件一样,简单地向您的struts-config.xml
文件添加该插件,如下所示:
<plug-in className=
"org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property=
"contextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>


窍门 1. 使用 Spring 的 ActionSupport
手动创建一个 Spring 环境是一种整合 Struts 和 Spring
的最直观的方式。为了使它变得更简单,Spring
提供了一些帮助。为了方便地获得 Spring
环境,org.springframework.web.struts.ActionSupport
类提供了一个 getWebApplicationContext()
方法。您所做的只是从 Spring 的 ActionSupport 而不是
Struts Action 类扩展您的动作,如清单 1 所示:
清单 1. 使用 ActionSupport 整合 Struts


package ca.nexcel.books.actions;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;


import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;


public class SearchSubmit extends ActionSupport { |(1)


public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {


DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm.get("isbn");


//the old fashion way
//BookService bookService = new BookServiceImpl();


ApplicationContext ctx =
getWebApplicationContext(); |(2)
BookService bookService =
(BookService) ctx.getBean("bookService"); |(3)


Book book = bookService.read(isbn.trim());


if (null == book) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError
("message.notfound"));
saveErrors(request, errors);
return mapping.findForward("failure") ;
}


request.setAttribute("book", book);
return mapping.findForward("success");
}



}


让我们快速思考一下这里到底发生了什么。在 (1)
处,我通过从 Spring 的 ActionSupport 类而不是 Struts 的
Action 类进行扩展,创建了一个新的 Action。在 (2)
处,我使用 getWebApplicationContext() 方法获得一个
ApplicationContext。为了获得业务服务,我使用在 (2)
处获得的环境在 (3) 处查找一个 Spring bean。

这种技术很简单并且易于理解。不幸的是,它将 Struts
动作与 Spring 框架耦合在一起。如果您想替换掉
Spring,那么您必须重写代码。并且,由于 Struts
动作不在 Spring 的控制之下,所以它不能获得 Spring AOP
的优势。当使用多重独立的 Spring
环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。


窍门 2. 覆盖 RequestProcessor
将 Spring 从 Struts
动作中分离是一个更巧妙的设计选择。分离的一种方法是使用
org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖
Struts 的 RequestProcessor 处理程序,如清单 2 所示:
清单 2. 通过 Spring 的 DelegatingRequestProcessor 进行整合


<?xml version="1.0" encoding="ISO-8859-1" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration
1.1//EN"


"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">


<struts-config>
<form-beans>
<form-bean name="searchForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="isbn" type="java.lang.String"/>
</form-bean>


</form-beans>


<global-forwards type="org.apache.struts.action.ActionForward">
<forward name="welcome" path="/welcome.do"/>
<forward name="searchEntry" path="/searchEntry.do"/>
<forward name="searchSubmit" path="/searchSubmit.do"/>
</global-forwards>


<action-mappings>
<action path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
<action path="/searchEntry"
forward="/WEB-INF/pages/search.jsp"/>
<action path="/searchSubmit"
type="ca.nexcel.books.actions.SearchSubmit"
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>


</action-mappings>


<message-resources parameter="ApplicationResources"/>


<controller processorClass="org.springframework.web.struts.
DelegatingRequestProcessor"/> |(1)


<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="csntextConfigLocation"
value="/WEB-INF/beans.xml"/>
</plug-in>


</struts-config>


我利用了 <controller> 标记来用 DelegatingRequestProcessor
覆盖默认的 Struts RequestProcessor。下一步是在我的 Spring
配置文件中注册该动作,如清单 3 所示:
清单 3. 在 Spring 配置文件中注册一个动作
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">


<beans>
<bean id="bookService"
class="ca.nexcel.books.business.BookServiceImpl"/>


<bean name="/searchSubmit"
class="ca.nexcel.books.actions.SearchSubmit"> |(1)
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>
</beans>
注意:在 (1) 处,我使用名称属性注册了一个
bean,以匹配 struts-config 动作映射名称。SearchSubmit
动作揭示了一个 JavaBean 属性,允许 Spring
在运行时填充属性,如清单 4 所示:
清单 4. 具有 JavaBean 属性的 Struts 动作
package ca.nexcel.books.actions;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;


import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;


public class SearchSubmit extends Action {


private BookService bookService;
public BookService getBookService() {
return bookService;
}


public void setBookService(BookService bookService) { | (1)
this.bookService = bookService;
}


public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {


DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm.get("isbn");


Book book = getBookService().read(isbn.trim()); |(2)


if (null == book) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new
ActionError("message.notfound"));
saveErrors(request, errors);
return mapping.findForward("failure") ;
}


request.setAttribute("book", book);
return mapping.findForward("success");
}



}


在清单 4 中,您可以了解到如何创建 Struts 动作。在
(1) 处,我创建了一个 JavaBean
属性。DelegatingRequestProcessor自动地配置这种属性。这种设计使
Struts 动作并不知道它正被 Spring
管理,并且使您能够利用 Sping
的动作管理框架的所有优点。由于您的 Struts
动作注意不到 Spring 的存在,所以您不需要重写您的
Struts 代码就可以使用其他控制反转容器来替换掉
Spring。

DelegatingRequestProcessor
方法的确比第一种方法好,但是仍然存在一些问题。如果您使用一个不同的
RequestProcessor,则需要手动整合 Spring 的
DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外,还有过一些使用一系列命令来代&shy;替
Struts RequestProcessor 的传闻。
这种改变将会对这种解决方法的使用寿命造成负面的影响。


窍门 3. 将动作管理委托给 Spring
一个更好的解决方法是将 Strut 动作管理委托给
Spring。您可以通过在 struts-config
动作映射中注册一个代理来实现。代理负责在 Spring
环境中查找 Struts 动作。由于动作在 Spring
的控制之下,所以它可以填充动作的 JavaBean
属性,并为应用诸如 Spring 的 AOP
拦截器之类的特性带来了可能。


清单 5 中的 Action 类与清单 4 中的相同。但是
struts-config 有一些不同:


清单 5. Spring 整合的委托方法
<?xml version="1.0" encoding="ISO-8859-1" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration
1.1//EN"


"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">


<struts-config>
<form-beans>
<form-bean name="searchForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="isbn" type="java.lang.String"/>
</form-bean>


</form-beans>


<global-forwards type="org.apache.struts.action.ActionForward">
<forward name="welcome" path="/welcome.do"/>
<forward name="searchEntry" path="/searchEntry.do"/>
<forward name="searchSubmit" path="/searchSubmit.do"/>
</global-forwards>


<action-mappings>
<action path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
<action path="/searchEntry"
forward="/WEB-INF/pages/search.jsp"/>
<action path="/searchSubmit"


type="org.springframework.web.struts.DelegatingActionProxy" |(1)
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>


</action-mappings>


<message-resources parameter="ApplicationResources"/>


<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/beans.xml"/>
</plug-in>


</struts-config>


清单 5 是一个典型的 struts-config.xml
文件,只有一个小小的差别。它注册 Spring
代理类的名称,而不是声明动作的类名,如(1)处所示。DelegatingActionProxy
类使用动作映射名称查找 Spring
环境中的动作。这就是我们使用 ContextLoaderPlugIn
声明的环境。


将一个 Struts 动作注册为一个 Spring bean
是非常直观的,如清单 6 所示。我利用动作映射使用
<bean> 标记的名称属性(在这个例子中是
"/searchSubmit")简单地创建了一个 bean。这个动作的
JavaBean 属性像任何 Spring bean 一样被填充:


清单 6. 在 Spring 环境中注册一个 Struts 动作
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">


<beans>
<bean id="bookService"
class="ca.nexcel.books.business.BookServiceImpl"/>


<bean name="/searchSubmit"
class="ca.nexcel.books.actions.SearchSubmit">
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>


</beans>


动作委托的优点
动作委托解决方法是这三种方法中最好的。Struts
动作不了解 Spring,不对代码作任何改变就可用于非
Spring 应用程序中。RequestProcessor
的改变不会影响它,并且它可以利用 Spring AOP
特性的优点。


动作委托的优点不止如此。一旦让 Spring 控制您的
Struts 动作,您就可以使用 Spring
给动作补充更强的活力。例如,没有 Spring
的话,所有的 Struts
动作都必须是线程安全的。如果您设置 <bean> 标记的
singleton
属性为"false",那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性,但是把它放在您的工具箱中也很好。&shy;您也可以利用
Spring 的生命周期方法。例如,当实例化 Struts
动作时,<bean> 标记的 init-method
属性被用于运行一个方法。类似地,在从容器中删除
bean 之前,destroy-method
属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与
Servlet 生命周期相同的方式进行管理。


在本文中,您已经学习了将 Struts 动作整合到 Spring
框架中的三种窍门。使用 Spring 的 ActionSupport 来整合
Struts(第一种窍门中就是这样做的)简单而快捷,但是会将
Struts 动作与 Spring
框架耦合在一起。如果您需要将应用程序移植到一个不同的框架,则需要重写代码。第二种解决方法通过委托
RequestProcessor
巧妙地解开代码的耦合,但是它的可扩展性不强,并且当
Struts 的 RequestProcessor
变成一系列命令时,这种方法就持续不了很长时间。第三种方法是这三种方法中最好的:将
Struts 动作委托给 Spring
框架可以使代码解耦,从而使您可以在您的 Struts
应用程序中利用 Spring
的特性(比如日志记录拦截器)。


本文摘自:http://www-128.ibm.com/developerworks/cn/java/j-sr2.html
综上所述,也会采用第三种方式来整合。
 

分享到:
评论

相关推荐

    struts+spring整合(全权委托)

    **整合Struts与Spring**的主要目的是将Struts的业务逻辑处理与Spring的IoC容器结合起来,以实现更高效、可维护的代码。"全权委托"意味着Action的创建和对象的依赖注入完全由Spring的IoC容器负责,这带来了以下几个...

    整合 Struts 应用程序与 Spring 的方式

    ### 整合 Struts 应用程序与 Spring 的方式 #### 一、引言 随着企业级应用的不断发展,框架间的整合变得越来越重要。Struts 和 Spring 作为两个流行的 Java Web 开发框架,在实际项目中常常需要进行整合,以便更好...

    用maven整合struts+spring+hibernate

    "用maven整合struts+spring+hibernate"这个主题,就是关于如何将这三大核心框架——Struts、Spring和Hibernate——集成到一个项目中的实践教程。Struts提供了MVC(Model-View-Controller)架构,Spring是全面的后端...

    整合struts+spring+hibernate实例

    通过以上步骤,我们成功地在WebLogic服务器上实现了Struts、Spring和Hibernate的整合,创建了一个Struts Portlet,从而能够在portlet环境下利用这三个框架的强大功能,提高开发效率和代码质量。这个实例不仅涵盖了...

    整合struts2和spring

    整合Struts2和Spring主要涉及以下几个关键步骤: 1. **添加依赖**:首先,需要在项目的构建配置文件(如Maven的pom.xml或Gradle的build.gradle)中添加Struts2和Spring的相关依赖库。这通常包括struts2-core、...

    Struts+Spring+Hibernet整合例子

    Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子

    Struts+Spring+Hibernate整合

    5. **整合Struts与Spring**:在Struts的Action类中,通过@Autowired注解注入Spring管理的Bean,或者通过Spring提供的ActionSupport基类来自动装配。 6. **整合Spring与Hibernate**:在Spring的配置文件中,配置...

    ssh整和技术struts与hibernate整合,struts与spring整合,hibernate与spring整合,struts,hibernate,sp

    Struts技术资料 hibernate技术资料 spring技术资料 ssh整合技术(struts与hibernate整合,struts与spring整合,hibernate与spring整合,struts,hibernate,spring整合)

    SSH整合源码(Struts+Spring+Hibernate整合用户注册例子)

    Struts和Spring之间通过ActionServlet和Spring的DispatcherServlet协同工作,而Spring与Hibernate之间的整合通常通过SessionFactoryBean和HibernateTemplate完成。 8. **用户注册流程**:用户提交注册信息后,...

    struts+spring+hibernate整合

    通过以上步骤,一个基本的Struts、Spring和Hibernate整合的应用就搭建完成了。这个整合的关键在于Struts处理HTTP请求,Spring管理业务对象和依赖,而Hibernate则处理数据库操作。这样的架构可以实现松耦合,便于代码...

    struts,spring,hibernate整合小例子

    5. **整合Spring与Hibernate**:在Spring配置文件中,配置Hibernate的SessionFactory,并创建DAO Bean,让DAO可以通过SessionFactory获取Session,进而执行数据库操作。 6. **测试与运行**:编写测试用例,确保各个...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...

    spring,struts,jdbc整合工程

    4. **整合Struts与Spring**:通过Spring-Struts的插件或者手动配置,使得Struts的Action由Spring管理,实现依赖注入。 5. **测试**:编写单元测试和集成测试,确保各个组件协同工作,请求能够正确地流转,并且...

    Spring整合Struts

    ### Spring与Struts的整合:实现灵活的企业级应用开发 在企业级应用开发领域,Spring框架和Struts框架都是极具影响力的技术。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,提供了良好的环境管理和...

    Struts2整合Spring、JPA

    Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...

    struts-spring整合.txt

    ### 一、整合Struts与Spring的原理 在Java Web开发中,Struts主要用于构建应用的控制器部分,处理用户的请求并控制页面流转;而Spring框架则侧重于管理业务逻辑层的Bean,实现依赖注入等功能。因此,将这两个框架...

    Struts整合Spring

    整合Struts与Spring的主要目的是利用Spring的强大功能来增强Struts的控制层,提高代码的可测试性和可维护性。 在整合Struts和Spring的过程中,首先需要确保你的项目环境中包含了这两个框架的兼容版本。对于本例中的...

    struts1 spring ibatis整合项目源码

    struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码struts1 spring ibatis整合项目源码

Global site tag (gtag.js) - Google Analytics