J2EE项目实训Struts框架技术——第10章 整合Struts和其他框架技术(第1部分)_第1页
J2EE项目实训Struts框架技术——第10章 整合Struts和其他框架技术(第1部分)_第2页
J2EE项目实训Struts框架技术——第10章 整合Struts和其他框架技术(第1部分)_第3页
J2EE项目实训Struts框架技术——第10章 整合Struts和其他框架技术(第1部分)_第4页
J2EE项目实训Struts框架技术——第10章 整合Struts和其他框架技术(第1部分)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第10章 整合struts和其他框架技术(第1/3部分)1.1 整合struts和spring 框架在struts框架中通过提供actionfrom组件类来封装与用户互动的数据元素,同时通过提供action组件类来接受用户请求、并对请求进行处理;另外还可以利用validatorplugin技术来对struts框架进行扩展以提供可配置的表单验证技术的支持。能否将struts框架与spring框架相互整合呢?1.1.1 将struts框架整合到spring框架中1、为什么要整合 struts 和 spring框架1)将struts框架与spr

2、ing 框架相互整合能够给struts应用带来多方面的优点1) 首先,spring 框架提供控制反转(ioc)技术进行对象的生命周期的管理、并倡导由容器为应用系统提供基础功能服务,从而可以降低应用系统在开发过程中所涉及的复杂性,提高系统的性能和可测试性。2) 其次,spring 框架中还提供了面向切面编程技术(aop)的支持和实现。一旦将两者相互整合后,不仅可以在struts框架中应用ioc技术,也还可以将spring aop有关的各种拦截器组件技术应用在struts框架的应用系统中。3) spring mvc框架组件对控制器的请求配置相对比较复杂,同时表示层也没有提供丰富和完整的标签库技术的

3、支持,而struts框架则能够弥补这些在表示层中的不足。因此,有必要将两者相互整合,从而能够充分地发挥各自的技术优势和特性。2)能够适应开发团队的目前技术水平从而减少技术培训的成本因为在目前的企业应用开发中,熟悉struts框架的人员相对比spring 框架的人员要多,这在组建开发团队时比较容易、同时也降低了人员的成本;另外,这样的系统设计也有利于人员的分工,不同技术层次和特长的人员可以完成系统中的不同开发任务。3)能够充分发挥各种开源框架的优点2、可以采用三种方法实现将struts 与spring 框架相互整合每种整合实现技术都有自己的优点和应用场合,通过掌握这三种相互整合的实现技术都能够使

4、读者加深对 struts框架 和 spring 框架各自的技术及具体应用方面的理解。同时,也有助于在应用系统的设计和开发实现中,为开发人员提供一个更广和更灵活的可选择的技术实现方案。这三种相互整合的实现方式分别为:1) 使用spring框架中的actionsupport类整合structs框架2) 使用spring框架的delegatingrequestprocessor类覆盖struts框架中的requestprocessor 3) 将struts框架中的各个action类委托给spring框架系统进行管理当然,无论开发人员使用哪种相互整合的技术,都需要使用 spring框架的 contex

5、tloaderplugin类为struts框架的actionservlet组件类装载spring框架的ioc的应用程序环境。就像添加任何其他的struts框架插件一样,在struts-config.xml 文件中添加该插件的配置定义。3、org.springframework.web.struts.contextloaderplugin类的定义及功能1)contextloaderplugin类的api定义下图10.1所示为摘录于spring 框架的api帮助文档中的contextloaderplugin类的api定义图示,该类实现了struts框架中的plugin接口。因此,它是struts框

6、架中的标准插件组件类。图10.1 contextloaderplugin类的api定义的示例2)contextloaderplugin类的主要功能通过参考spring 框架中的api帮助文档,读者可以了解到contextloaderplugin类作为struts框架的插件,为struts框架的actionservlet类加载spring ioc的xml配置文件而构建出webapplicationcontext类的对象实例。然后就可以在action组件类中通过webapplicationcontext对象的getbean方法获得目标业务组件对象实例。4、将spring框架中的contextloa

7、derplugin类作为struts框架的插件为了使得spring框架的ioc控制反转容器也能够对struts框架的action组件进行对象管理,在三种不同形式的整合方法中,都有一个共同的要求将spring框架中的contextloaderplugin类作为struts框架的插件。1)通过该插件实现加载spring ioc的xml配置文件spring框架在设计时就充分考虑了与struts框架的协同整合方面的问题,通过在spring框架中内置提供满足struts框架的插件(plug-in)而实现两者之间的相互整合关联。通过该插件实现加载spring ioc的xml配置文件以创建出webappli

8、cationcontext类对象实例,从而可以在action组件类中也可以通过依赖注入技术来获得目标业务层组件对象实例。当然,开发人员也可以采用在spring框架中整合其它mvc 框架时的共同配置方法加载contextloaderlistener组件的方式来获得spring框架的webapplicationcontext对象。2)缺省的spring ioc的xml文件的配置文件名称在相互整合时,默认的spring ioc 的xml配置文件的名称是映射的struts框架的actionservlet 的名字,加上 “-servlet.xml”的后缀而形成的完整文件名称。比如,如果在 web.xml

9、文件中所配置的应用系统中的struts 框架的actionservlet组件所定义的名称为“action”(也就是定义为action),那么默认的spring ioc 的xml配置文件的名称就是 /web-inf/action-servlet.xml(并放在应用系统的web-inf目录下)。 而如果采用默认的spring ioc 的xml配置文件作为系统中的xml文件,此时只需要在struts 框架的struts-config.xml 文件中采用标签对spring框架所提供的实现整合的contextloaderplugin插件类进行如下的配置:3)单个自定义的spring框架的ioc的xml文

10、件的配置如果在项目中的spring框架的ioc的xml文件没有采用默认的spring ioc 的xml配置文件的形式,则配置标签可以通过下面【例10-1】的示例形式来实现。其中通过contextconfiglocation属性来定义ioc的xml文件的名称和路径,本示例为在当前站点中的web-inf目录下的businessbeans.xml文件。【例10-1】单个自定义的spring框架的ioc的xml文件的配置示例 4)多个自定义的spring框架的ioc的xml文件的配置在项目中的功能模块比较多时,采用一个spring框架ioc的xml配置文件可能会不方便,而需要使用多个不同的xml配置文

11、件。此时的contextconfiglocation属性的定义请见【例10-2】所示的示例,并请注意其中的黑体部分的代码。本示例为在当前站点中的web-inf目录下的action-servlet.xml和applicationcontext.xml文件。【例10-2】多个自定义的spring框架的ioc的xml文件的配置示例 1.1.2 使用actionsupport类来整合struts和spring1、org.springframework.web.struts.actionsupport类1)org.springframework.web.struts.actionsupport 类的主要

12、功能通过查看spring api的帮助文档,可以了解到actionsupport 类为org.apache.struts.action.action类的子类,主要提供在struts的action组件中获得spring框架的webapplicationcontext对象。因为在actionsupport 类中提供了一个 getwebapplicationcontext() 方法,从而可以在struts框架的相关程序中获得spring 框架有关的ioc的控制环境,也就能够获得目标业务组件类的对象实例。2)getwebapplicationcontext方法为了方便地获得spring框架的webap

13、plicationcontext对象,在org.springframework.web.struts.actionsupport 类中提供了一个getwebapplicationcontext方法。为此,应用系统中的各个action组件类只需要从 spring框架的actionsupport类(而不是再是struts框架的action类)继承以扩展系统中struts框架的action组件类,请见【例10-3】所示的userloginaction类的继承关系的示例。然后通过所获得的webapplicationcontext对象中的getbean方法获得指定id名称的ioc容器中的业务组件对象实例

14、。【例10-3】所示为实现此功能的代码示例,并请注意其中的黑体部分的代码。【例10-3】在action类中获得spring 框架ioc容器中的javabean组件的代码示例public class userloginaction extends actionsupport public actionforward execute(actionmapping actionmapping, actionformactionform,httpservletrequest httpservletrequest,httpservletresponse httpservletresponse) /(1)使

15、用 getwebapplicationcontext() 方法获得一个 applicationcontext applicationcontext applicationcontext = getwebapplicationcontext();/(2)通过spring ioc容器获得实现用户登录功能的业务组件类的 spring ioc javabean组件对象 businessinterface userloginbusiness = (businessinterface)applicationcontext.getbean(userloginbusiness);/(3) 再对业务组件类进行访

16、问以完成具体的功能实现,在此省略 注意:其中的getbean(userloginbusiness)中的“userloginbusiness”的名称是在spring ioc的xml配置文件中所定义的businessinterface接口的实现类的对象实例。2、为什么要将系统中的action组件类从actionsupport 类进行继承在常规的struts 框架web应用系统的action类中获得在spring ioc容器中的各个业务组件类的对象实例,一般是采用webapplicationcontextutils 工具类从servletcontext环境对象中获得webapplicationcon

17、text;当然,更简单和方便的方式便是继承spring框架的actionsupport类。因为,在actionsupport 类中提供了更加便利的getwebapplicationcontext()方法。具体的功能实现代码请见【例10-3】所示,同时也还应该注意在spring框架中,已经针对struts 框架中不同的action类提供了对应不同的actionsupport类的支持,以便能够更好地满足struts 框架的特别应用要求。spring框架包含了所有标准struts框架中的各种形式的action子类,这些子类的名称是在类名末尾处附加了support,如下面所示的各种形式的actions

18、upport子类及对应的struts框架中的action子类。1) actionsupport是对action类的继承2) dispatchactionsupport是对dispatchaction类的继承3) lookupdispatchactionsupport是对lookupdispatchaction类的继承4) mappingdispatchactionsupport是对mappingdispatchaction类的继承3、如何在struts框的其它组件类中获得webapplicationcontext对象在应用系统的开发中,可能还会遇到需要在struts框架的其它组件类特别是在业务

19、组件类和自定义的标签库中获得webapplicationcontext对象的要求。通过查看org.springframework.web.struts.contextloaderplugin类的源代码,发现contextloaderplugin类是把所获得的webapplicationcontext对象保存在servletcontext环境对象中。因此,只要能够在web应用中获得servletcontext对象也就能获得webapplicationcontext对象。下面为实现的代码示例:applicationcontext applicationcontext=webapplicationc

20、ontextutils.getwebapplicationcontext(this.getservletcontext();1.1.3 采用覆盖 requestprocessor的方法来实现整合采用本节将要介绍的“采用覆盖 requestprocessor的方法来实现整合”方法的确比前一节中所介绍的“使用actionsupport类来整合struts和spring”方法要优越,因为struts框架中的各个action组件类不再需要继承spring框架中的api类,能够减少紧密藕合的关系;同时由于action类也能够被spring ioc容器进行管理,因此可以将spring aop技术应用到st

21、ruts框架中系统的表示层组件中。但是这种整合方式,也仍然存在着一些问题,比如如果应用系统需要使用不同的 requestprocessor组件类以产生各种特殊的拦截效果,则需要调整spring框架中的 delegatingrequestprocessor类的配置。1、该整合方式的实现原理为了能够将 spring框架api从struts框架的action类中分离出,从而达到解藕struts框架对spring框架的紧密依赖的设计目标。为此可以应用在spring框架中所提供的org.springframework.web.struts.delegatingrequestprocessor 类来覆盖

22、struts框架中的requestprocessor请求处理器组件类。2、 实现此设计目标的主要方法1)在struts-config.xml文件中增加配置标签利用标签配置定义出delegatingrequestprocessor类(),该请求处理器组件类org.springframework.web.struts.delegatingrequestprocessor作为实际的struts框架中的requestprocessor类的代理类,并由该delegatingrequestprocessor类首先获得spring的ioc的webapplicationcontext组件对象,然后再正常地调用

23、struts框架中的requestprocessor类以完成实际的请求处理功能。当然要注意的是,如果在基于struts框架技术实现的应用系统中使用了tiles框架技术,则需要将配置标签中的delegatingrequestprocessor类改变为支持tiles框架的delegatingtilesrequestprocessor类。此时的配置标签应该设计为:2)在spring ioc的xml文件中声明action类的对象实例在spring ioc的xml配置文件中,将系统中的各个action类(如本示例中的userloginaction类)作为一个普通的javabean组件进行注册声明,并将业

24、务组件对象以属性注入的方式注入。在【例10-4】中定义了一个名称为userloginbusiness的业务组件类userloginbusiness的对象实例和一个名称为“/userloginaction”的userloginaction类的对象实例。并将userloginbusiness业务组件类以属性注入的方式注入到userloginaction类中。【例10-4】在spring ioc的xml文件中声明action类的对象实例 在此种整合方式中,所应该注意的是struts框架中的各个action组件类的对象定义的名称不能采用id属性,而应该采用name属性(请见【例10-4】中的黑体部分的

25、标签属性);并且该name属性的值是struts-config.xml文件中的action-mapping 的“path”的属性值。3)修改userloginaction类以增加userloginbusinessbean成员属性定义【例10-5】所示的代码是对【例10-3】所示的代码进行修改后的结果代码,主要在下面几个方面进行了改动,并请注意其中的黑体部分的代码。1) 将userloginaction直接继承action类,而不需要再继承actionsupport类2) 在该类中定义businessinterface业务接口的成员属性对象userloginbusiness,并为该对象提供get

26、/set方法。【例10-5】对userloginaction类进行修改后的代码示例package strutsspringweb;import org.apache.struts.action.*;import javax.servlet.http.*;import org.springframework.context.applicationcontext;import org.springframework.web.struts.actionsupport;public class userloginaction extends extends action private busines

27、sinterface userloginbusiness=null; public void setuserloginbusiness(businessinterface newuserloginbusiness) userloginbusiness=newuserloginbusiness; public businessinterface getuserloginbusiness() return userloginbusiness; public actionforward execute(actionmapping actionmapping, actionform actionfor

28、m, httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) userloginform userloginform = (userloginform) actionform; string username = (userloginform.getusername().trim(); string userpassword = (userloginform.getuserpassword().trim(); userinfo oneuserinfo=new userinfo(); oneu

29、serinfo.setusername(username); oneuserinfo.setuserpassword(userpassword); if (userloginbusiness.dobusiness(oneuserinfo) return (actionmapping.findforward(loginsuccess); else return (actionmapping.findforward(loginfailure); 3、 对此种整合方式的执行流程的说明1)产生出“/userloginaction”的http请求当用户产生出“/userloginaction”的http

30、请求(也就是以“/userloginaction.do”形式发出的请求)时,struts框架的actionservlet组件类会首先找到这个请求所对应的类org.springframework.web.struts.delegatingactionproxy,而由于delegatingactionproxy类本质上是个代理类,它会再去找在【例10-4】所示的xml文件中由名称为“/userloginaction”所对应的真正实现类(也就是userloginaction类);然后再把它对象实例化,同时把所需要的业务组件类对象userloginbusiness注入;最后再执行真正的action类中

31、的execute方法。2) 单例形式的action组件类的对象实例在【例10-4】的示例中,将userloginaction类定义成单例形式的action组件类的对象实例(请见【例10-4】示例中的singleton=false的属性定义),即每次请求都新建一个userloginaction类的对象实例,这也就解决了struts框架中action组件类的线程同步问题,从而能够产生出线程安全的action组件类代码。1.1.4 将struts的action类的管理委托给 spring来整合该整合方法是在三种整合方式中比较好的一种方式,它能够实现松散的整合,也不需要对struts框架的action

32、组件类进行任何形式的扩展修改和不需要替换struts框架中的requestprocessor类;同样也能充分地应用spring框架中的ioc技术,也包括spring aop的各个方面的技术特性。这主要包括能够在基于struts框架技术的应用系统中充分利用spring所提供的附加功能单例对象的特性从而产生线程安全的action类,可以利用 spring 的生命周期方法实现对action类进行初始化和管理(例如,当实例化 struts action类对象时, 标签的“init-method”属性可以用来指定一个初始化方法;同样“destroy-method”属性执行一个销毁方法)。1、org.sp

33、ringframework.web.struts.delegatingactionproxy类1)delegatingactionproxy同样是org.apache.struts.action.action类的一个子类由于delegatingactionproxy类同样也是struts框架的org.apache.struts.action.action类的一个子类,并把用户的http请求转发给真正的action组件类来。请见下面的【例10-6】所示的delegatingactionproxy类的execute方法代码片段。【例10-6】delegatingactionproxy类中的exec

34、ute方法代码片段示例public actionforward execute(actionmapping mapping,actionform form,httpservletrequest request,httpservletresponse response) throws exception /获得实际的action实例,并将请求转交action delegateaction = getdelegateaction(mapping);return delegateaction.execute(mapping, form, request, response);2)该类的主要作用是实现

35、代理功能每次产生“*.do”的请求时,struts框架中的actionservlet组件在运行期实际加载的是delegatingactionproxy代理类, 而delegatingactionproxy代理类则实现了针对实际action类的调用代理,struts框架最终调用的将是由spring框架ioc容器所管理的action类的对象实例。3)提供delegatingactionproxy类的主要目的通过这样的整合方式,spring框架能够获得对struts框架中的action 组件类对象实例的管理权,它将对action组件类进行调度,并为struts框架提供所需的action组件的对象实例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论