J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc

上传人:啊飒飒 文档编号:10361938 上传时间:2021-05-11 格式:DOC 页数:16 大小:140KB
返回 下载 相关 举报
J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc_第1页
第1页 / 共16页
J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc_第2页
第2页 / 共16页
J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc_第3页
第3页 / 共16页
J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc_第4页
第4页 / 共16页
J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc》由会员分享,可在线阅读,更多相关《J2EE项目实训Struts框架技术——第12章 Struts2框架技术及应用(第1部分).doc(16页珍藏版)》请在三一文库上搜索。

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第12章 Struts2框架技术及应用(第1/4部分)基于Struts1.X版架构的Struts框架技术可以说是目前Java开源社区中最经典的一个Web MVC框架,尽管目前已经推出了许多其它类型的Web MVC框架技术如Spring MVC框架、WebWork MVC框架、JSF MVC框架等,从而大大地丰富了J2EE Web应用开发技术实现,使得开发人员在应用系统的开发中有更多的技术实现选择余地。Apache开源社区为了完善和改进原有的Struts框架技术,对基于Struts1.X版架构的Struts框架重新进行了系统设计和实现,于2

2、007年正式推出了基于WebWork技术体系架构的Struts2.0框架。Struts2.0框架是原有的Struts项目和Open Symphony社区WebWork2.2项目的合并版本,并集成了这两大流行的MVC框架的各自的优点,这对原有的Struts框架来说是一个质的提升。因此,Struts2框架是WebWork框架的升级,而不应该是Struts1.X版架构的Struts框架的升级。虽然Struts2框架提供了与基于Struts1.X版架构的原有Struts框架的兼容,但已经不是简单地对它的升级。因为目前的Struts2框架与原先的Struts框架有着完全不同的系统架构设计和API类库。本

3、章为读者介绍Struts2框架有关的技术及具体的实际应用等方面的内容这主要包括Struts2框架系统体系架构及各种资源文件、业务控制器Action组件类及拦截器组件技术及应用,最后也还将介绍如何对Struts2框架中的Action组件类进行单元测试。1.1 Struts2框架体系结构及各种组件1.1.1 Struts2框架系统体系架构1、基于Struts1.X版架构的Struts框架优缺点回顾1)Struts框架的主要优点本书在前面的各个章节中,主要介绍了基于Struts1.X版架构的Struts框架技术,该架构体系下的Struts框架系统主要优点可以归纳如下:1) 实现MVC架构模式:系统的

4、总体结构清晰,使开发人员只需要关注应用系统本身的业务逻辑的功能实现,而不必再需要考虑系统的总体结构设计是否符合标准MVC架构模式的要求、模型层和表示层是否会产生紧密藕合等方面的问题。2) 为开发人员提供有丰富的自定义标签库:在应用系统的开发中,开发人员如能灵活地应用Struts框架中所提供的各种标签,则能大大地提高应用系统表示层组件的开发效率、并提高页面的可维护性。3) 提供ActionForm表单请求数据的包装组件:利用ActionForm表单组件可以实现对系统中表示层页面表单中的各个成员属性字段进行对象包装,从而可以实现面向对象的页面表单数据访问、并分离业务处理功能实现和业务请求数据。4)

5、 提供良好的页面导航方面的支持:通过一个名称为struts-config.xml的XML配置文件,实现整个应用系统中表示层和控制层中的各个功能组件之间的联系,有利于系统后期的维护和功能扩展、并分离各个组件之间的紧密关联关系。5) 提供可配置化的异常处理机制的支持:在Struts框架中的异常处理实现是可配置化的,从而可以提高系统中的错误处理的灵活性。6) 其他方面的技术支持:Tiles框架、Validator验证器框架、数据库连接池管理、国际化和表单重复提交等其他应用技术的支持。 从上面所罗列出的这些特性,不可否认Struts框架对J2EE Web应用开发技术的普及和应用所发挥出的作用。但毕竟S

6、truts框架的总体设计是在2001年完成的,尽管以后也在不断地完善和改进。但目前的J2EE 技术的迅速地发展、产生出了许多很优秀的Web MVC框架。原有的Struts框架技术在目前的企业应用系统的开发中不断地暴露出了许多的不足。 2)Struts框架的主要缺点Struts1.X版架构的Struts框架技术在具体应用时也体现出许多不足,读者通过本书前面的各个章节的学习,也应该能够体验出下面所描述的这些问题确实存在。其一主要表现为控制层Action组件的设计和应用方面:1) 由于Action组件是单实例多线程的工作方式,因此必须要求开发人员自己保证是线程安全的。如果涉及对系统中的共享资源进行访

7、问,所有的资源都必需要统一同步,否则将会引发线程安全的问题产生。 2) Action组件过分依赖于Servlet容器,由于在Action组件中需要获得HttpServletRequest和HttpServletResponse等与Servlet容器有关的各个对象,因此在具体应用时将不能摆脱对J2EE Servlet容器的依赖性。3) 不便于单元测试的具体实施,主要是由于控制层Action组件与Web表示层组件有一定的耦合关系。对它的单元测试也就会依赖于Web容器,尽管可以采用本书第9章中所介绍的StrutsTestCase框架实现单元测试,但也只能采用模拟测试方式。 另一方面则是其Action

8、Form表单包装组件的设计和应用方面,尽管ActionForm组件在应用时能够为开发人员带来许多便利,但也表现出下面所罗列出的一些不足之处:l 由于Struts框架的ActionForm表单包装组件是把所有的数据都作为String类型进行包装,开发人员尽管可以使用Apache Commons-Beanutils工具类进行类型转化。但它的转化都是在类级别的,而且转化的类型是不可配置的。因此,在具体应用开发中经常会出现类型转化的错误,这给开发带来了许多的不便。 l ActionForm表单包装组件对事件支持不够细致,只在表单级别实现了事件支持属于应用级的事件支持(Application Event

9、),而没有为表单中的某个属性字段提供事件支持属于组件级的事件支持(Component Event)。因此,这将导致在表单的事件支持方面比较粗糙,不利于开发人员对表示层页面表单的精细控制,为此必须借用AJAX(Asynchronus JavaScript And XML,异步JavaScript和XML技术)的配合来增强页面的交互性。3)Struts 2框架是在WebWork2框架的基础上经过整合而产生Struts 2框架很好地解决了上述Struts框架所面临的各个问题,因为Struts 2框架是在WebWork2(由Open Symphony社区开发的)框架的基础上经过整合而产生的。Strut

10、s 2框架提供了更灵活的控制层和ActionForm表单包装组件技术实现,主要是基于过滤器Filter、JavaBean组件、资源包ResourceBundle、本地语言环境识别Locale和XML等多种标准的技术基础之上,也还提供了对基于OGNL和XWork等各种Open Symphony社区开发的资源包的支持和重用。2、Struts2框架是在WebWork2的基础上发展的下段英文内容,原引自Apache官方网站对Struts2框架技术的介绍:Apache Struts 2 was originally known as WebWork 2. After working independen

11、tly for several years, the WebWork and Struts communities joined forces to create Struts2. This new version of Struts is simpler to use and closer to how Struts was always meant to be.由此不难看出,虽然Struts2框架在名称上依然称为“Struts”,但是Struts2框架与Struts框架相比已经可以说是不同的两种框架了。Struts是基于“Model2模型”的,最初设计它的目的是为了能够更好地实现和应用MV

12、C框架。但由于Struts框架技术出现的时间比较早,在当时的技术环境下只能兼容于J2EE Web JSP技术标准,当然也就不能很好地和现在比较流行的工具如FreeMaker、AJAX等工具和有关的先进技术进行有效的合作。另外,在Struts 2官方网站上也可以找到如下介绍Struts 2框架有关技术的文字:Essentially,Struts 2.0 is the technical equivalent of WebWork 2.3。Aside from the package and property renaming,it isnt much different than,say,mig

13、rating from WebWork 2.1 to 2.2。意思是说:Struts 2.0技术等同于WebWork 2.3框架,除了系统包和属性被改名外。从WebWork 2.2迁移到Struts 2不会比从WebWork 2.1迁移到WebWork 2.2更复杂。因此,Struts2框架是在WebWork2基础上扩展而产生的,与原有的Struts框架相比,它的MVC结构更完整,并且可以与FreeMaker等工具很好地合作。在功能的实现上其最大的特点便是不再拘泥于ActionForm组件类和Action组件类允许开发人员对带有表单的JSP页面,自由地决定是否选择对应的ActionForm组件

14、类;而且Action组件类也不再强制性地要求应用继承方式实现,也不再在Action组件类中耦合多种HTTP有关的参数对象。这样的设计实现方案不仅简化了Web应用系统的开发过程,更重要的是完善了系统的体系结构,也更方便了对Web应用系统中的控制层组件单元测试的实施。3、Struts2框架的系统架构及工作流程下图12.1所示为摘录于Struts2.0版框架系统帮助文档所附带的Struts2的系统架构图,此架构图主要分为五个部分,在图12.1中分别以数字标识。每个部分的主要内容的说明如下:第1部分:分别代表了客户端的一次Http请求,和服务器端运算结束之后的一次响应输出;第2部分:代表Servlet

15、 过滤器;第3部分:WebWork框架的核心部分;第4部分:拦截器部分;第5部分:需要开发人员自己开发的各个部分的程序,其中包括:Action类,页面模板,配置文件xwork.xml(在Struts2框架中实际为struts.xml文件)等。如果读者熟悉OpenSymphony组织开发的WebWork框架,应该能够发现图12.1所示的Struts2系统架构图,其实就是WebWork2的系统架构图。因此,Struts2框架也就同样具有与WebWork2相同的特性前置拦截器(Interceptor)、运行时表单属性验证、类型转换,强大的表达式语言(OGNL,the Object Graph Not

16、ation Language)和控制反转IoC(Inversion of Control)容器等。Struts2框架的处理流程主要为下面所描述的过程:1) 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组件链中(如ActionContextCleanUp整合SiteMesh时需要应用该过滤器,FilterDispatcher过滤器等,请参考图12.1所示)。其中FilterDispatcher是控制器的核心,也就是MVC中控制层的核心组件。2) 核心控制器组件FilterDispatcher根据ActionMapper中的设置获得是否

17、需要调用某个Action组件来处理这个HttpServletRequest请求,如果ActionMapper决定需要调用某个Action组件,FilterDispatcher核心控制器组件就会把请求的处理权委托给ActionProxy组件。图12.1 Struts2的系统架构图这是Struts2框架中的FilterDispatcher和Struts框架中的ActionServlet组件的不同处之一,只有这样才能使得用户实现的业务控制器Action类不需要与Servlet API耦合。1) ActionProxy组件通过Configuration Manager组件获得Struts2框架的配置文

18、件(Struts2框架为struts.xml配置文件,而在WebWork框架中是xwork.xml配置文件),最后找到需要调用的目标Action组件类;然后ActionProxy组件就创建出一个实现了命令模式的ActionInvocation类的对象实例(这一过程包括在调用Action组件本身之前调用所有的拦截器组件中的before()方法),同时ActionInvocation组件通过代理模式调用目标Action组件。但在调用之前ActionInvocation组件会根据配置文件中的设置项目加载与目标Action组件相关的所有拦截器组件(Interceptor)。2) 一旦Action组件执

19、行完毕,ActionInvocation组件将根据开发人员在struts.xml配置文件中的定义的各个配置项目获得对应的返回结果为这个Action组件的结果码(一个字符串,如success,input等),然后根据该返回的结果调用目标JSP页面以实现显示输出。3) 最后各个拦截器组件会被再次执行(但顺序和开始时相反,并调用after()方法),然后请求最终被返回给在系统的部署描述文件web.xml中配置的其他的过滤器。如果已经设置了ActionContextCleanUp 过滤器,那么FilterDispatcher就不会清理在ThreadLocal对象中保存的ActionContext信息。

20、如果没有设置ActionContextCleanUp 过滤器,FilterDispatcher就会清除掉所有的ThreadLocal对象。从图12.1所示的Struts2框架系统架构及工作流程图示中,我们可以了解到在整个请求的生命周期中仍然是以控制器(Controller)作为主体,而且也与原有的Struts框架系统一样,继续通过URL请求的参数来调用Actions组件,并且所有服务器端的对象(如HttpServletRequest、HttpServletResponse和HttpSession等) 仍然可以在Action组件类中获取。但Struts2框架控制层设计与原有的Struts框架系统

21、的控制层设计有很大的不同,这主要体现在增加了拦截器组件、Action组件类不再与J2EE Servlet容器紧密藕合。4、Struts2框架控制层中的前端控制器组件1)在Struts2框架中提供多种不同形式的拦截器组件辅助控制请求调度一个客户请求产生后并最终经由Struts2框架中的Action组件处理完毕之前,需要经过多个不同类型的拦截器组件进行前置处理(请参考图12.1中的第4部分标识中的各个拦截器组件)。而且允许开发人员根据对请求处理不同层次的要求,可以配置不同的拦截器或者拦截器链。这些拦截器链中的各个组件为请求提供了各种预处理、切面处理等方面的功能。当然,这种设计思想其实和原有的Str

22、uts框架中使用 Jakarta Commons Chain 组件的 RequestProcessor组件类很相似,但更加模板化和职责分离。由于在Struts 2框架中大量使用拦截器组件来处理用户的请求,从而就能够达到将业务逻辑的控制器与J2EE Servlet API相互分离的解藕设计目标因为Struts 2框架中的各种拦截器是面向切面编程(AOP,Aspect Oriented Programming)技术中的切面组件(Advice)。2)各个拦截器组件组成一个链式结构并相互协作Struts2框架是一种支持拦截器(Interceptor)技术的框架,通过各个拦截器组件实现将应用系统中与控制

23、调度有关的共同功能行为独立出来,并在系统的Action组件执行前和后被触发执行。这种设计方案也就是面向切面编程技术(AOP)和思想的具体应用,AOP是分散关注点的编程方法,它将通用需求的功能从不相关类中分离出来。因此,客户端提交产生出对某个Aciton组件的HttpServletRequest请求时,Struts2框架中的FilterDispatcher组件会根据请求的类型,调度并执行相应的业务控制器Action组件。而在Action组件被执行之前,要调用各个拦截器组件中的方法以完成在请求处理之前的共性的功能实现(如身份验证、初始化请求的资源等)。同样,在Action组件执行完毕后仍然会触发各

24、个拦截器组件以完成对请求处理后的善后处理功能要求。3)控制层设计中应用各种拦截器组件的主要目的Struts2框架在系统总体架构设计方面,在控制层设计中大量地应用各种拦截器组件的主要目的,一方面除了要达到AOP中所倡导的“分离核心关注点和辅助关注点”的设计目标以外,另一方面则是希望将系统中的业务控制器Action组件独立于J2EE Servlet 容器,从而达到对业务逻辑的控制调度与J2EE Servlet API相互分离的解藕设计目标。Struts 2框架的控制器组件是Struts 2框架的核心,目前所有MVC框架都是以控制器组件为核心的。Struts 2框架的控制器也是由两个部分组成Filt

25、erDispatcher过滤器组件和业务控制器Action组件类。当然,起主要作用的业务控制器其实不是开发人员编程定义及实现的Action组件类,而是由Struts 2框架系统生成的Action组件代理(也就是图12.1中所标识的ActionProxy组件),但该ActionProxy组件会回调用户编程定义的各个业务控制器Action组件。4)在Web应用系统部署描述文件web.xml中配置出FilterDispatcher组件Struts 2框架也是J2EE 核心设计模式(J2EE Core Pattern)中的前端控制器设计架构的具体实现,通过一个J2EE Web Servlet或者Fil

26、ter控制器组件提供一个统一的请求入口、并解析请求的URL,再根据请求的具体要求去调用相应的业务控制器Action组件中的目标方法进行相应的业务处理。为此,也同样需要在Web应用系统中的部署描述文件web.xml中配置出其前端控制器FilterDispatcher过滤器组件(而原有的Struts框架是采用一个普通的Servlet组件来承担的)。该过滤器组件初始化Struts 2框架中的各种配置信息(主要来自于struts.xml配置文件中的各个定义和设置项目),并解析有关的Action组件的配置信息,根据请求去组装和调用执行相应的拦截器、Action组件、Action Result(Actio

27、n执行结果的输出)等。具体的配置示例请见下面【例12-1】所示的web.xml文件中的部分配置定义标签,并请注意其中的黑体部分的内容。【例12-1】在web.xml文件中配置出FilterDispatcher组件的示例 struts2org.apache.struts2.dispatcher.FilterDispatcherdevMode true struts2*.action 读者从【例12-1】所示的配置项目中应该能够发现出,Struts 2框架在前端控制器的设计方面仍然与原有的Struts框架相似,只是将ActionServlet组件改变为FilterDispatcher组件。而Fil

28、terDispatcher组件在执行时会自动地查找struts.xml文件(该文件在缺省的应用方式下必须放在/WEB-INF/classes目录中)、并对该XML文件中的各个配置项目进行解析。5)可以为FilterDispatcher组件提供各种初始化参数当配置定义FilterDispatcher过滤器组件类时,可以为它指定一系列的初始化参数比如【例12-1】中所示的“devMode”。当然,这些初始化参数也可以在后面将要介绍的struts.xml和struts.properties文件中进行配置定义。1.1.2 Struts2框架业务控制器Action组件1、业务控制器Action组件类不再

29、与J2EE Servlet容器紧密藕合1)如何达到Action组件类不再与J2EE Servlet容器紧密藕合的设计目标由于Struts 2框架对业务控制器Action组件类的设计目标是希望不再与J2EE Servlet容器紧密藕合,因此在前端控制器FilterDispatcher组件和用户的实际业务控制器Action组件类之间设计有Action代理(ActionProxy)和一系列的拦截器组件类(请参考图12.1中所示的 Struts2的系统架构图示)。因此,在Struts 2框架中用于处理用户请求的实际Action类实例,并不是开发人员实现的业务控制器Action组件类,而是ActionP

30、roxy(Action代理)类从而才有可能使得开发人员实现的业务控制器Action组件类不再与J2EE Servlet API相互耦合。2)Struts 2框架应用ActionProxy代理隔离Action组件对Servlet容器的依赖下图12.2中所示为Struts框架和Struts2框架控制层架构的对比图示,其中上图为原有的Struts框架控制层架构,而下图为Struts2框架控制层的架构。读者从图12.2中可以了解到Struts 2框架是应用ActionProxy代理类来隔离开发人员实现的业务控制器Action组件对Servlet容器的依赖这是代理模式的具体应用。图12.2 Struts

31、框架和Struts2框架中的控制层架构的对比但应用了ActionProxy代理这样的设计方案后所带来的问题是,开发人员实现的业务控制器Action组件类显然无法直接处理用户的请求因为无法获得请求的参数。为此,在Struts 2框架中提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中所包装的请求参数解析出来,并以成员属性的方式传入到开发人员实现的业务控制器Action组件类中(对Action组件类中的setXXX()属性访问方法进行回调),而ActionProxy代理类也会回调开发人员实现的业务控制器Action组件类中的默认的execute方法或者其他自定义的业务处

32、理方法(但需要声明定义)来处理用户请求。开发人员实现的业务控制器Action组件类仅仅是ActionProxy类的代理目标,尽管用户请求的数据是包含在HttpServletRequest对象中,也无需直接访问HttpServletRequest请求对象。而用户请求的各种参数,可以由拦截器组件传入因为拦截器组件会负责将HttpServletRequest请求对象中所封装的用户请求的各种数据解析出,并传给开发人员实现的业务控制器Action组件类的对象实例。2、Struts 2框架中的Action组件类的编程及应用1)Struts 2框架中的Action组件类可以为普通的JavaBean组件类St

33、ruts 2框架中的Action组件类在设计实现方面完全不同于Struts框架中的原有的Action组件类,因为Struts2是拉模式的MVC(“Pull-MVC”)架构这将允许开发人员可以直接在Action组件类中主动地获取请求的参数、而需要在表示层组件中显示给用户的数据也可以直接从Action组件类中获取,而不必像Struts框架那样必须把请求的参数包装到ActionForm组件或者将处理后的结果缓存到request(HttpServletRequest请求)或者session(HttpSession会话)等对象、并转发到表示层的目标资源(如JSP页面)中获取这些参数。另外,Struts框

34、架中原有的Action组件类必须继承org.apache.struts.action.Action或者其特殊功能的子类(如DispatchAction类),表单数据封装在ActionForm组件中。而Struts 2框架中的Action组件类无须继承任何类型或实现任何接口,表单数据直接包含在Action组件类中,并通过get/set方法获取这些属性参数。表12.1 说明了Struts框架和Struts 2框架中的Action和表单数据在具体编程实现时的不同要求。2)Struts 2框架中的Action组件类的代码实现示例从理论上来说,Struts2框架中的业务控制器Action组件类是无须实现

35、任何接口或者是继承任何有关的类。但是,在实际编程应用中,为了更加方便和规范地实现开发人员自己的Action组件类、同时也有利于国际化技术的应用和实现(这可以在Action类中使用getText方法获得对应key所指示的国际化信息字符串),大多数情况下都会选择继承于com.opensymphony.xwork2.ActionSupport类(该类其实是一种适配器模式的适配器类,它实现了com.opensymphony.xwork2.Action接口)、并且重写其中的String execute()方法。读者可以参考【例12-2】中的Action组件类模板代码示例。表12.1 Struts和Str

36、uts 2框架中的Action和表单数据编程要求Struts框架中的Action和表单组件编程要求Struts 2框架中的Action和表单组件编程要求接口必须继承org.apache.struts.action.Action或者其子类无须继承任何类型或实现任何接口表单数据表单数据封装在FormBean中表单数据包含在Action中,通过Getter和Setter获取下面的【例12-2】所示为一个示例化的Action组件类模板代码,在该FirstStruts2Action组件类中重写了ActionSupport基类中的execute方法,并定义了一个成员属性actionProperty(请见黑

37、体部分的代码)、同时为它提供get/set属性访问方法。【例12-2】Action组件类模板代码示例package com.px1987.struts2example.action;import com.opensymphony.xwork2.ActionSupport;public class FirstStruts2Action extends ActionSupport private String actionProperty; public String getActionProperty () return actionProperty; public void setAction

38、Property(String actionProperty) this.actionProperty= actionProperty; public String execute() actionProperty= 您好!欢迎您访问Struts2框架技术实现的Web系统; return SUCCESS;public String doSayHello() actionProperty= 您好!欢迎您访问Struts2框架技术实现的Web系统; return SUCCESS;3)Action组件类的返回值是一个标准字符串所应该注意的是,Action组件类中的execute方法的返回值是一个标准

39、字符串,而不是象Struts框架中的ActionForward对象。其中的符号常量“SUCCESS”是在接口com.opensymphony.xwork2.Action中定义出的符号常量,在Action接口中同时定义的符号常量还有ERROR、INPUT、LOGIN和NONE等。对这些符号常量的含义,读者可以参考Struts2框架中的API 帮助文档中的说明。在Struts框架的Action组件类中只有名称为“execute”方法才能对请求进行处理,但在Struts2框架的Action组件类中任何声明为public String methodName() 的方法,都能通过一定的配置定义实现对请求

40、进行处理。另外,Struts2框架基类ActionSupport中的execute方法是不带参数的(请见【例12-2】中的黑体部分的方法定义),它使用反转控制(IoC,Inversion of Control) 模式中的“依赖注入”(Dependency Injection)技术获取所需要的目标请求对象参数。因此,Struts2框架中的Action组件类在具体编程实现时可以是与Servlet容器无关的(而Struts框架的Action类是依赖于Servlet API,因为其execute方法中藕合有Servlet API)。开发人员在具体编程实现时,也应该尽可能避免或排除在Action组件类中

41、直接访问HttpServletRequest请求对象或HttpServletResponse响应对象等与Servlet容器有关的各种 API。3、自定义Struts 2框架Action组件类的控制调度方法Struts 2框架在默认情况下,当用户在浏览器中以“/firstStruts2Action.action”产生请求时,Struts2框架运行时(Runtime)系统程序会根据开发人员在struts.xml文件中的Action映射集(Mapping)的配置(请参考【例12-4】中所示的struts.xml文件示例),实例化com.px1987.struts2example.action.Fir

42、stStruts2Action类,并调用其中的execute方法。当然,开发人员也可以通过下面的方法改变这种默认的方法调用:在sturts.xml文件中利用标签指明目标调用的方法(请参考【例12-4】中所示的struts.xml文件示例),而在产生HTTP请求访问该Action组件时,只需要在请求的目标Action名后加上“!xxx”(其中的xxx为目标方法的名称)。也就是用户可以采用http:/127.0.0.1:8080/Struts2Web/selfStruts2Action.action方式直接对名称为selfStruts2Action的Action组件产生HTTP请求,此时Strut

43、s2框架运行时系统将调用在struts.xml文件中的名称为selfStruts2Action的Action映射集配置标签中的“method”属性所指示的目标方法(本示例为【例12-2】中的doSayHello方法);当然,用户也可以http:/127.0.0.1:8080/Struts2Web/firstStruts2Action!doSayHello.action的方式产生HTTP请求,此时Struts2框架运行时系统将对在struts.xml文件中的名称为firstStruts2Action 的Action映射集配置标签中的“class”属性所指示的目标Action组件调用,但目标方法则

44、由请求中的“!doSayHello”字符串决定(本示例同样为【例12-2】中的doSayHello方法)。4、Struts 2框架Action组件类是线程安全的Struts框架中的Action组件类是单对象实例多线程模式,因此开发人员在具体编程实现时必须自行要保证是线程安全的Action组件类。单例策略形式的Action组件类限制了Struts框架中的Action类的功能发挥,并且要求开发人员在编程开发实现时特别要小心对共享资源的访问必须保证是线程安全的或同步的。而Struts2框架中的Action组件类是针对每一个请求产生出一个对象实例,因此没有线程安全的问题存在(Servlet容器给每个请

45、求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题的出现)。5、Struts 2框架Action组件类的单元测性技术由于原有的Struts框架Action组件类的execute方法暴露了Servlet API(比如HttpServletRequest和HttpServletResponse等类),因此对它们的单元测试要依赖于Servlet容器。当然读者可以采用本书第9章“基于Struts框架的单元测试技术”中所介绍的Struts TestCase框架进行单元测试,但也只能应用模拟方式而不是真正的环境下的测试。而Struts 2框架Action组件类由于本质上是一个POJO的JavaBean

46、组件类,因此对它们的单元测性可以象对其它JavaBean类一样的方式进行单元测试。可以通过简单的对象初始化、设置请求的属性参数、调用被测试的目标方法来实施单元测试的过程,并且借助于“依赖注入”技术的支持。最终也将使单元测试更容易地实施。6、在Action组件类中访问Servlet API在应用系统开发中,可能需要在Action组件类中访问Servlet API或者由容器所创建的对象,比如request(HttpServletRequest对象)、response(HttpServletResponse对象)或session(HttpSession对象)等。由于Struts 2框架中的Actio

47、n组件类为POJO类型的JavaBean组件,因此无法像原有Struts框架中的Action组件execute方法通过参数引入它们。在Struts 2框架中可以有两种方式获得这些Servlet容器对象:非IoC(控制反转Inversion of Control)方式和IoC方式。1)非控制反转IoC的方式利用com.opensymphony.xwork2.ActionContext类中的静态方法getContext()获取当前Action的上下文对象,或者利用org.apache.struts2.ServletActionContext帮助类中的getXXX方法快捷地获得所需要的目标Servlet容器对象。 ServletActionContext(org.apache.struts2.ServletActionContext)类直接继承了ActionContext类,并提供了直接与J22EE Servlet相关对象访问的功能,它可以取得的对

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1