您所在的位置:开发 > Java > 使用Spring更好地处理Struts动作(1)

使用Spring更好地处理Struts动作(1)

2006-10-23 16:15 George Franciscus Ibm 字号:T | T
一键收藏,随时查看,分享好友!

在本文中,我利用控制反转(IOC)设计模式把一个Struts应用程序注入Spring框架,您将亲身体会到IOC模式的强大。具体了解三种将Struts MVC整合到Spring框架的方法并将揭示每种方法的缺陷并且对比它们的优点。

AD:

Struts Recipes的合著者George Franciscus将介绍另一个重大的Struts整合窍门——这次是将Struts应用程序导入Spring框架。请跟随George,他将向您展示如何改变Struts动作,使得管理Struts动作就像管理Spring beans那样。结果是一个增强的web框架,这个框架可以方便地利用Spring AOP的优势。

您肯定已经听说过控制反转(IOC)设计模式,因为很长一段时间以来一直在流传关于它的信息。如果您在任何功能中使用过Spring框架,那么您就知道其原理的作用。在本文中,我利用这一原理把一个Struts应用程序注入Spring框架,您将亲身体会到IOC模式的强大。

将一个Struts应用程序整合进Spring框架具有多方面的优点。首先,Spring是为解决一些关于JEE的真实世界问题而设计的,比如复杂性、低性能和可测试性,等等。第二,Spring框架包含一个AOP实现,允许您将面向方面技术应用于面向对象的代码。第三,一些人可能会说Spring框架只有处理Struts比Struts处理自己好。但是这是观点问题,我演示三种将Struts应用程序整合到Spring框架的方法后,具体由您自己决定使用哪一种。

我所演示的方法都是执行起来相对简单的,但是它们却具有明显不同的优点。我为每一种方法创建了一个独立而可用的例子,这样您就可以完全理解每种方法。

为什么Spring这么了不起?

Spring的创立者Rod Johnson以一种批判的眼光看待Java企业软件开发,并且提议很多企业难题都能够通过战略地使用IOC模式(也称作依赖注入)来解决。当Rod和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了Spring框架。简言之,Spring是一个轻型的容器,利用它可以使用一个外部XML配置文件方便地将对象连接在一起。每个对象都可以通过显示一个JavaBean属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个XML配置文件中把它们连接好。

依赖注入是一个强大的特性,但是Spring框架能够提供更多特性。Spring支持可插拔的事务管理器,可以给您的事务处理提供更广泛的选择范围。它集成了领先的持久性框架,并且提供一个一致的异常层次结构。Spring还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。

Spring AOP允许您使用拦截器在一个或多个执行点上拦截应用程序逻辑。加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础,所以拦截器广泛用于日志记录。您很快就会看到,为了处理横切关注点,Spring AOP发布了它自己的拦截器,您也可以编写您自己的拦截器。

整合Struts和Spring

与Struts相似,Spring可以作为一个MVC实现。这两种框架都具有自己的优点和缺点,尽管大部分人同意Struts在MVC方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用Struts作为构造高品质软件的基础。Struts具有如此大的推动力,以至于开发团队宁愿整合Spring框架的特性,而不愿意转换成Spring MVC。没必要进行转换对您来说是一个好消息。Spring架构允许您将Struts作为Web框架连接到基于Spring的业务和持久层。最后的结果就是现在一切条件都具备了。

在接下来的小窍门中,您将会了解到三种将Struts MVC整合到Spring框架的方法。我将揭示每种方法的缺陷并且对比它们的优点。一旦您了解到所有三种方法的作用,我将会向您展示一个令人兴奋的应用程序,这个程序使用的是这三种方法中我最喜欢的一种。

三个小窍门

接下来的每种整合技术(或者窍门)都有自己的优点和特点。我偏爱其中的一种,但是我知道这三种都能够加深您对Struts和Spring的理解。在处理各种不同情况的时候,这将给您提供一个广阔的选择范围。方法如下:

◆使用Spring的ActionSupport类整合Structs
◆使用Spring的DelegatingRequestProcessor覆盖Struts的RequestProcessor
◆将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>

每个例子都为一个书籍搜索应用程序提供一种不同的Struts和Spring的整合方法。您可以在这里看到例子的要点,但是您也可以下载应用程序以查看所有的细节。

窍门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。

内容导航



分享到:

  1. 我热爱编程,但厌恶这个行业
  2. 关于爬虫技术的门道,这篇文章总结的最全

热点职位

更多>>

热点专题

更多>>

读书

超级网管员——网络安全
本书全面深入地介绍网络安全的配置与实现技术,包括系统管理、用户账户、病毒防御、灾难恢复、文件备份、安全策略、注册表等服务

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院