网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  深入探讨 spring 与 struts 的集成方案     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:108次  录入:管理员--2007-11-16  
 

spring是一个轻量级(大小和系统开支的角度)的ioc和aop容器.它力图简化j2ee开发即j2ee without ejb.而且作为帮助企业级开发的核心支柱,spring为模型层(or持久层:hibernate、jdo、ibatis等)服务层(ejb、jndi、webservice)以及表现层(struts、jsf、velocity)都提供了良好的支持和集成方案. 访问spring官方站

jakarta-struts是apache软件组织提供的一个开源项目.它为java web应用提供了基于model-view-controller的mvc框架,尤其适用于开发大型可扩展的web应用.尽管基于java的mvc框架层出不穷,事实上spring的mvc模型也提供了驱动应用系统web层的能力,但jakarta-struts仍然是所有这些框架中的佼佼者.

下面,将如何整合这两个j2ee领域的经典项目给出两套详尽的集成方案.


1.首先我们来看一个spring-struts整合应用下的控制器action类源代码.


public class courceaction extends action {
private courceservice courceservice;
public actionforward execute(
actionmapping mapping,
actionform form,
httpservletrequest request,
httpservletresponse response) throws exception {
set allcources = courceservice.getallcources();
//..........the other statements
request.setattribute("cources", allcources);
return mapping.findforward("jspview");
} }


分析:courceservice为一个业务实现的接口,此接口声明了一系列的业务处理方法.该方法的实现配置为spring上下问的一个bean.由此看来,我们大家都可能会产生一个疑问:struts action如何取得一个包含在spring上下文中的bean呢?为了回答这个问题,spring提供了两种与struts集成的方式:

(1).从一个知晓spring上下文的基类派生我们自己的struts action类.然后,在派生类中就可以使用super.xx()方法来获得一个对spring受控bean的引用.

(2).将请求委托给作为spring bean管理的struts action来处理.

2.注册spring插件:为了使struts action能够访问由spring管理的bean,我们就必须要注册一个知道spring应用上下文的struts插件.可以在struts-config.xml中通过如下的方式来完成注册.


< plug-in classname="org.springframework.web.struts.contextloadplugin">
< set-property value="web-inf/yhcip.xml,......" property="contextconfiglocation">
< /plug-in>


contextloadplugin()负责装载一个spring应用上下文.(具体的说:是一个webapplicationcontext).value属性值为要加载的配置spring受控bean的xml文件的uri.

3.完成第一种集成方案:实现一个知晓spring的action基类.

这种集成方案是从一个公共的能够访问spring应用上下文的基类中派生所有的struts action,但值得庆幸的是:我们不用自己去编写这个知晓spring应用上下文的基类,因为spring已经提供了org.springframework.web.struts.actionsupport:一个org.apache.struts.action.action的抽象实现.它重载了setservlet()方法以从contextloaderplugin中获取webapplicationcontext.因此,任何时候我们只需要调用super.getbean()方法即可获得一spring上下文中的一个bean的引用.

我们再来看一段action源代码:


public class courceaction extends actionsupport {
public actionforward execute(
actionmapping mapping,
actionform form,
httpservletrequest request,
httpservletresponse response) throws exception {
//取得spring上下文
applicationcontext context = super.getwebapplicationcontext();
//取得courceservice bean
courseservice courseservice = (courseservice) context.getbean("courseservice");
set allcources = courceservice.getallcources(); request.setattribute("cources", allcources);
//..........the other statements.
return mapping.findforward("jspview");
}}


分析:这个action类由actionsupport派生,当courceaction需要一个spring受控bean时:它首先调用基类的getwebapplicationcontext()方法以取得一个spring应用上下文的引用;接着它调用getbean()方法来获取由spring管理的courceservice bean的一个引用.

小结

至此,我们已经用第一种方案圆满的完成了spring与struts的集成工作.这种集成方式的好处在于直观简洁容易上手.除了需要从actionsupport中派生,以及需要从应用上下文中获取bean之外,其他都与在非spring的struts中编写和配置action的方法相似.但这种集成方案也有不利的一面.最为显著的是:我们的action类将直接使用spring提供的特定类,这样会使我们的struts action(即控制层)的代码与spring紧密耦合在一起.这是我们不情愿看到的.另外,action类也负责查找由spring管理的bean,这违背了反向控制(ioc)的原则.

4.实现第二种集成方案:代理和委托action.

这种集成方案要求我们编写一个struts action,但它只不过是一个包含在spring应用上下文中的真正struts action的一个代理.该代理action从struts插件contextloaderplugin中获取应用上下文,从中查找真正的struts action,然后将处理委托给真正的struts action.这个方法的幽雅之处在于:只有代理action才会包含spring特定的处理.真正的action可以作为org.apache.struts.action的子类来编写.

下面我们来看一段在之中集成方式下的struts action源代码:


public class courceaction extends action {
private courceservice courceservice;
public actionforward execute(
actionmapping mapping,
actionform form,
httpservletrequest request,
httpservletresponse response) throws exception {
set allcources = courceservice.getallcources();
request.setattribute("cources", allcources);
//..........the other statements.
return mapping.findforward("jspview");
}
/* 注入courceservice */
public void setcourceservice(courceservice courceservice) {
this.courceservice = courceservice;
}}


分析:大家可以看到,在这种方式之下,我们的struts action类和spring是低耦合的,它仅仅依赖了spring提供的反向控制(ioc)机制把courceservice注入到了我们的action中.到此,大家肯定会有一个疑问:那就是spring到底是如何提供ioc反向控制的呢?回答这个问题,我们需要完成两个步骤的配置:

(1).在struts-config.xml中注册struts action.但要注意的是我们在这里注册的是代理action.幸运的是,我们不必亲自编写这个类.因为spring已经通过org.springframework.web.struts.delegatingactionproxy提供了这个代理的action.具体的配置方法如下:


< action type="org.springframework.web.struts.delegatingactionproxy" path="/listcourses">


(2)将真正的struts action作为一个spring bean并在spring上下文配置文件中作为一个bean注册之.并将action所要引用的courceservice注入给它.


< bean class="com.eredcip.web.courceaction" name="/listcourses">
< property name="">
< ref bean="courseservice">
< /property>
< /bean>


注意:name属性的值是非常重要的,它必须和struts-config.xml中的path属性完全一致.这是因为delegatingactionproxy会使用path属性值在spring上下文中查找真正的action.使用delegatingactionproxy的好处在于我们可以不使用任何spring特定的类来编写struts action.同时,struts动作能够利用ioc取得和他合作的对象.唯一不足之处就是不太直观,配置相对复杂.为了使action委托显得更为直观一些,我们可对这种集成方案做进一步的改进:使用请求委托.

5.使用请求委托.

为了使action委托看上去更为直观一些,spring提供了delegatingrequestprocessor,另一种专门用于spring的请求处理器.需要在struts-config.xml中做如下配置:


< controller processorclass="org.springframework.web.struts.delegatingrequestprocessor">


这样,delegatingrequestprocessor将告诉struts自动将动作请求委托给spring上下文中的action来处理.这使得我们可以在struts-config.xml中用struts action的真正类型来声明它们.例如:


< action type="com.eredcip.web.courceaction" path="/listcourses">


当接受到一个针对/listcourses的请求时,delegatingrequestprocessor会自动从spring上下文配置文件中查找一个名为/listcourses的bean(实为一个struts action)类.


< action type="com.eredcip.web.courceaction" path="/listcourses">


 
 
上一篇: 怎样把weblogic ejb程序迁移到jboss上    下一篇: java高级--如何掌握jdk1.5的枚举类型
  相关文档
如何感受java 2 ee 5.0的最新规范特性 11-16
java正则表达式; regular expression 11-17
使用jsp程序连接oracle的步骤和程序 11-17
程序人生--软件人才需具备6个基本素质 03-06
servlet容器工作原理讲解(三) 11-17
j2se新特性 windows下读取网卡物理地址 11-16
java api 中文版 11-17
kodo ejb:实现类和类之间的关联关系 11-16
arguments 属性 11-16
struts模块化编程经典实战教程(一) 11-17
专稿:实战ejb之五 开发实体bmp(ejb 1.1规范) 11-17
ibmjava如何做到高性能gc的实现内幕 11-17
jsp程序流程图 11-17
java咖啡馆(10):情人节的applet 11-16
为 swt windows桌面程序定制适合分发的 jre 11-17
深入浅出java clone技术(3) 11-17
java:applications与applets 11-17
进阶--servlet-api基本类和接口介绍 01-23
介绍scjp考试中文大纲 11-17
java上加密算法的实现用例(2) 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息