窍门 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”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。
拦截 Struts
前面提到过,通过将 Struts 动作委托给 Spring 框架而整合 Struts 和 Spring 的一个主要的优点是:您可以将 Spring 的 AOP 拦截器应用于您的 Struts 动作。通过将 Spring 拦截器应用于 Struts 动作,您可以用最小的代价处理横切关注点。
虽然 Spring 提供很多内置拦截器,但是我将向您展示如何创建自己的拦截器并把它应用于一个 Struts 动作。为了使用拦截器,您需要做三件事:
- 创建拦截器。
- 注册拦截器。
- 声明在何处拦截代码。
这看起来非常简单的几句话却非常强大。例如,在清单 7 中,我为 Struts 动作创建了一个日志记录拦截器。 这个拦截器在每个方法调用之前打印一句话:
清单 7. 一个简单的日志记录拦截器
package ca.nexcel.books.interceptors;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class LoggingInterceptor implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("logging before!");
}
}
这个拦截器非常简单。before() 方法在拦截点中每个方法之前运行。在本例中,它打印出一句话,其实它可以做您想做的任何事。下一步就是在 Spring 配置文件中注册这个拦截器,如清单 8 所示:
清单 8. 在 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">
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>
<!-- Interceptors -->
<bean name="logger"
class="ca.nexcel.books.interceptors.LoggingInterceptor"/> |(1)
<!-- AutoProxies -->
<bean name="loggingAutoProxy"
class="org.springframework.aop.framework.autoproxy.
BeanNameAutoProxyCreator"> |(2)
<property name="beanNames">
<value>/searchSubmit</valuesgt; |(3)
</property>
<property name="interceptorNames">
<list>
<value>logger</value> |(4)
</list>
</property>
</bean>
</beans>
您可能已经注意到了,清单 8 扩展了 清单 6 中所示的应用程序以包含一个拦截器。具体细节如下:
在 (1) 处,我注册了这个拦截器。
在 (2) 处,我创建了一个 bean 名称自动代理,它描述如何应用拦截器。还有其他的方法定义拦截点,但是这种方法常见而简便。
在 (3) 处,我将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作,则只需要在 "beanNames" 下面创建附加的 <value> 标记。
在 (4) 处,当拦截发生时,我执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于“beanNames”。
就是这样。就像这个例子所展示的,将您的 Struts 动作置于 Spring 框架的控制之下,为处理您的 Struts 应用程序提供了一系列全新的选择。在本例中,使用动作委托可以轻松地利用 Spring 拦截器提高 Struts 应用程序中的日志记录能力。
结束语
在本文中,您已经学习了将 Struts 动作整合到 Spring 框架中的三种窍门。使用 Spring 的 ActionSupport 来整合 Struts(第一种窍门中就是这样做的)简单而快捷,但是会将 Struts 动作与 Spring 框架耦合在一起。如果您需要将应用程序移植到一个不同的框架,则需要重写代码。第二种解决方法通过委托 RequestProcessor 巧妙地解开代码的耦合,但是它的可扩展性不强,并且当 Struts 的 RequestProcessor 变成一系列命令时,这种方法就持续不了很长时间。第三种方法是这三种方法中最好的:将 Struts 动作委托给 Spring 框架可以使代码解耦,从而使您可以在您的 Struts 应用程序中利用 Spring 的特性(比如日志记录拦截器)。
三种 Struts-Spring 整合窍门中的每一种都被实现成一个完整可用的应用程序
分享到:
相关推荐
web="C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://www.bitscn.com/ exe= 本程序由Strong编制,技术支持QQ:86055325;本程序仅供自用不含版权问题. 本程序使用方法:name项为按钮名;Web项为所要打开的...
网站检测系列教程第三课:利用百度谷歌关键字批量检测网站 关键字:inurl:asp?articleid= ----------------------------------- 关键字:网站建设公司企业网站管理系统 后缀: admin/login.asp -------------------...
远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息
在Linux环境下安装phpMyAdmin可以帮助用户更方便地管理MySQL数据库。本文将详细介绍如何在Linux系统中安装并配置phpMyAdmin,以便用户能够轻松地对MySQL数据库进行管理。 #### 二、准备工作 1. **下载phpMyAdmin...
无线网络工具ApTools 文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html
- **下载地址**:[http://.bitsCN.com/os/windows/289850.html](http://.bitsCN.com/os/windows/289850.html) 3. **设置显卡优先级** - **AMD显卡**: - 打开Catalyst Control Center,进入“电源”->“可切换...
Linux集群是一种将多台计算机通过高速网络连接,协同工作,对外提供单一系统映像和高可用性服务的技术。集群系统可以提升系统的性能、可靠性和可伸缩性,是大型企业和组织应对高流量、高并发场景的重要解决方案。在...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要涉及的是“超级嗅探狗”这一软件的激活码。为了确保内容的专业性和准确性,下面将详细介绍与该...希望以上介绍能够帮助您更好地理解和使用该软件。
具体步骤可以参考链接:[使用提示](http://www.bitscn.com/pdb/php/200701/95558.html)。 #### 六、总结与扩展 通过以上六个步骤,我们可以有效地解决PHP环境下MySQL的UTF-8乱码问题。除了上述方法之外,还可以...
This time we bring you the best software to hack the WiFi networks 2010. El compilado incluye potente software en detecció...文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html
1. Everything简介 Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name instantly)”。它体积小巧,界面简洁易用,...【转自bbs.bitsCN.com】
了解并掌握这些知识点,可以有效地提升Oracle数据库的性能,减少资源消耗,为用户提供更快速、更稳定的数据库服务。在实际工作中,结合监控工具、性能分析报告和数据库设计,对SQL进行持续优化是至关重要的。
CK 1.2 B时间:2001-12-02 06:14来源:中国网管联盟作者:bitsCN编辑字体:[大 中 小]电脑诊所出品 正式版 1.2 B 使用帮助: From: [10001] To:[10009] 此栏为扫描的 OICQ 号码范围,选中 [V] Scan Mode 即可开启...
- 厦门人家v2008.files" — 这个文件夹可能包含与上述文章相关的附件或补充材料,如截图、配置文件样本等,帮助读者更好地理解和实践Informix的初始化过程。 4. "INFORMIX5的安装及初始配置 配置 初始 安装 系统 ...
EMF(Eclipse Modeling Framework)是基于OMG的MOF(Meta-Object Facility)标准,为开发人员提供了一种在Eclipse环境中构建和使用模型驱动工程(MDE)工具的方法。 【描述】虽然描述为空,但通过提供的博文链接...
压缩包中的"滚动字幕制作手册_HTML+DIV+CSS_中国网管联盟bitsCN_com.mht"文件很可能包含了更详细的教程,包括实际的代码示例、步骤指南以及可能遇到的问题与解决方案。这份资源对于希望提升网页动态效果的开发者来说...
实验目的:搭建一个域控制器并将客户机加入域 ...用交叉线连起来,并如图分配好ip地址 实验步骤: BBS.bitsCN.com国内最早的网管论坛 1. 配置Server (1)配置ip地址参数 bitscn.com中国网管
在IT领域,Shell脚本是Linux和Unix系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。以下是对"shell脚本的编写"这个主题的详细解释。 首先,让我们理解什么是Shell。...
在IT行业中,Shell脚本是Linux和Unix系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。这个压缩包文件包含了关于shell脚本编写和源码的相关资料,非常适合初学者和有...
一款适合日常管理的网管软件,能实现基本的监视、定位、检测、追踪等功能。这款软件的最大特点就是可以让我们制作出自己的电子拓扑图,以后,无论是日常管理还是故障定位,只要在电子拓扑图中...【转自bbs.bitsCN.com】