- 浏览: 140796 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
renovatio:
...
JAVA的远程控制系统(远程监控)实现 -
xiaofan_0204:
有点恶心呀,少了一个类……………………
JAVA中HTTP的多线程下载程序 -
h286271819:
你奶奶,DownloadNetThread 类呢?
JAVA中HTTP的多线程下载程序 -
ileson:
LINUX 之旅 (-)起因 -
panshunchang:
<pre name="code" c ...
java 分布式RMI的简单使用
URL:http://www.ibm.com/developerworks/cn/java/j-sr2.html
George Franciscus (george.franciscus@nexcel.ca), 负责人, Nexcel
2005 年 10 月 11 日
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 框架的方法后,具体由您自己决定使用哪一种。
我所演示的方法都是执行起来相对简单的,但是它们却具有明显不同的优点。我为每一种方法创建了一个独立而可用的例子,这样您就可以完全理解每种方法。 请参阅 下载 部分获得完整例子源代码。请参阅 参考资料,下载 Struts MVC 和 Spring 框架。
Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java™ 企业软件开发,并且提议很多企业难题都能够通过战略地使用 IOC 模式(也称作依赖注入)来解决。当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了 Spring 框架。简言之,Spring 是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。
|
依赖注入是一个强大的特性,但是 Spring 框架能够提供更多特性。Spring 支持可插拔的事务管理器,可以给您的事务处理提供更广泛的选择范围。它集成了领先的持久性框架,并且提供一个一致的异常层次结构。Spring 还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。
Spring AOP 允许您使用拦截器 在一个或多个执行点上拦截应用程序逻辑。加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础,所以拦截器广泛用于日志记录。您很快就会看到,为了处理横切关注点,Spring AOP 发布了它自己的拦截器,您也可以编写您自己的拦截器。
|
与 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 所示:
- 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. 使用 ActionSupport 整合 Struts
让我们快速思考一下这里到底发生了什么。在 (1) 处,我通过从 Spring 的 ActionSupport
类而不是 Struts 的 Action
类进行扩展,创建了一个新的 Action
。在 (2) 处,我使用 getWebApplicationContext()
方法获得一个 ApplicationContext
。为了获得业务服务,我使用在 (2) 处获得的环境在 (3) 处查找一个 Spring bean。
这种技术很简单并且易于理解。不幸的是,它将 Struts 动作与 Spring 框架耦合在一起。如果您想替换掉 Spring,那么您必须重写代码。并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。
将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。分离的一种方法是使用 org.springframework.web.struts.DelegatingRequestProcessor
类来覆盖 Struts 的 RequestProcessor
处理程序,如清单 2 所示:
- xml version="1.0" encoding="ISO-8859-1" ?>
- "-//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>
清单 2. 通过 Spring 的 DelegatingRequestProcessor 进行整合
我利用了 <controller></controller>
标记来用 DelegatingRequestProcessor
覆盖默认的 Struts RequestProcessor
。下一步是在我的 Spring 配置文件中注册该动作,如清单 3 所示:
清单 3. 在 Spring 配置文件中注册一个动作
- xml version="1.0" encoding="UTF-8"?>
- "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
。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外,还有过一些使用一系列命令来代替 Struts RequestProcessor
的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。
一个更好的解决方法是将 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" ?>
- "-//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></bean>
标记的名称属性(在这个例子中是 "/searchSubmit
")简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充:
清单 6. 在 Spring 环境中注册一个 Struts 动作
- xml version="1.0" encoding="UTF-8"?>
- "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></bean>
标记的 singleton 属性为“false”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性,但是把它放在您的工具箱中也 很好。您也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时,<bean></bean>
标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。
|
评论
写的太好呢
不敢顶
终于有人顶呢啊
发表评论
-
build.xml(xdoclet,hibernate,SchemaExportTask)
2007-08-04 16:49 2049xml 代码 xml version=" ... -
Hibernate 的Xdoclet模板
2007-07-21 08:23 1837xml 代码 <?xml version= ... -
Hibernate 中的多对多的关系:
2007-07-19 23:41 2090作者:shazi. 数据库的 ... -
Hibernate配置文件--hibernate.cfg.xml
2007-07-19 09:48 2957Hibernate的mysql配置。 xml 代码 ... -
Hibernate的Session管理之HibernateSessionFactory
2007-07-19 09:41 4749myeclipse 生成的hibernateUtil类,感觉实 ... -
jspSmartUpload 实现jsp文件上传下载
2007-07-10 09:51 5379转载 www.csdn.net ... -
正则表达式收集
2007-03-20 14:36 775正则表达式收集 只能输入数字:"^[0-9]*$& ... -
经典正则表达式
2007-03-20 14:38 709转载 www.qysoft.net 正 ...
相关推荐
### 整合 Struts 应用程序与 Spring 的方式 #### 一、引言 随着企业级应用的不断发展,框架间的整合变得越来越重要。Struts 和 Spring 作为两个流行的 Java Web 开发框架,在实际项目中常常需要进行整合,以便更好...
"整合struts+hibernate+spring应用开发详解"是一个系列教程,旨在帮助开发者深入理解这三者如何协同工作。 首先,Struts是一个MVC(Model-View-Controller)框架,它主要处理HTTP请求,负责控制应用程序的流程。在...
### Spring与Struts整合的三种主要方式 在Java Web开发领域,Spring框架和Struts框架都是非常重要的技术。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能,为Java应用提供了轻量级的解决方案。而...
整合Struts2和Spring主要涉及以下几个关键步骤: 1. **添加依赖**:首先,需要在项目的构建配置文件(如Maven的pom.xml或Gradle的build.gradle)中添加Struts2和Spring的相关依赖库。这通常包括struts2-core、...
Struts2、Hibernate和Spring是Java企业级应用中三大核心框架,它们的整合使用能够构建出高效、可维护性高的Web应用程序。本篇将深入剖析这三者如何协同工作,并提供实际范例应用。 首先,Struts2作为MVC(模型-视图...
本文将详细介绍两种整合Struts1与Spring的方法。 首先,我们需要理解这两个框架的基本概念。Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它专注于控制层,处理用户请求并转发到相应的...
**SSH整合**主要是指通过一系列的技术手段,将Struts、Spring 和 Hibernate 这三个独立的框架融合到一起,形成一个统一的开发框架,以便于更好地进行Web应用程序的开发工作。 - **Struts**:主要负责表现层(View)...
《精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例全书》是一本深入探讨J2EE Web应用程序开发的专业书籍。J2EE,全称Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级分布式应用程序的...
以下将详细阐述Spring与Struts整合的三种方式: 1. **使用Spring的ActionSupport** 这种方式是通过让Struts的Action类继承Spring的`ActionSupport`类,使Action类能够访问Spring的ApplicationContext。首先,在`...
Spring 和 Struts 整合是企业级 Java 应用开发中常见的技术组合,它们各自在应用程序架构中扮演着重要的角色。Spring 提供了依赖注入(DI)和面向切面编程(AOP),而 Struts 则是一个经典的MVC框架,用于处理用户...
通过整合Struts2、Spring与Hibernate,学生成绩管理系统不仅实现了基本的登录、学生信息和成绩管理功能,还通过分页技术增强了用户体验。更重要的是,这一整合展示了如何利用现代Java EE框架构建复杂企业级应用的...
Spring 和 Struts2 是两个...总之,Spring 和 Struts2 的整合利用了两者的优势,提供了一种强大的方式来构建可扩展、易于维护的 Java Web 应用。通过深入学习和实践,开发者可以掌握这种整合技巧,并在实际项目中应用。
Spring与Struts和Hibernate的整合是企业级开发中的常见实践,书中会阐述如何在Spring环境中配置Struts和Hibernate,以及如何利用Spring的IoC容器来管理应用的生命周期。 通过这本书,读者不仅可以学习到各个框架的...
整合Struts1、Spring2和Hibernate2的过程主要包括以下步骤: 1. **配置环境**:确保所有依赖库已添加到项目的类路径中,如struts-core.jar、spring-framework.jar和hibernate-core.jar等。 2. **配置Struts1**:...
Struts、Hibernate和Spring是Java开发中非常著名的三大框架,它们各自解决应用程序的不同层次问题,而将它们整合在一起,能够构建出高效、可维护的Web应用程序。本项目是一个基于这三个框架实现的简单登录功能,旨在...
首先,关键步骤是使Struts的ActionServlet能够加载Spring的应用程序环境。这可以通过在Struts的配置文件`struts-config.xml`中引入Spring的`ContextLoaderPlugin`实现。例如: ```xml <struts-config> ... ...
在Java Web开发领域,"三大框架整合(struts+Hibernate+spring)"是指将Struts、Hibernate和Spring这三款流行的开源框架结合在一起,构建高效、可维护的企业级应用程序。这种集成通常被称为SSHA(Struts、Spring、...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自在应用程序的不同层面发挥着重要作用。Struts2作为MVC(模型-视图-控制器)框架,主要负责处理用户请求和控制应用程序流程;Hibernate是一个对象...