1、对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。Struts ActionServlet控制器对象ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文
2、件的指定描述,转发到适当的处理器。按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息如下。actionorg.apache.struts.action.ActionServlet全部的请求URI以*.do的模式存在并映射到这个servlet,其配置如下:action*.do一个该模式的请求URI符合如下格式:http:/www.my_site_ 了 发 的 ,如 理 、 表 据。它 提供一个通 制如 处理, , , 据, 据转。当 户 器端提
3、currency1请求的“,信息是fi发fl到控制器ActionServlet,一 控制器得了请求,其就 将请求信息currency1一 类(help classes)处理。这 类如何处理”请求信息所对 的 。在Struts中,这个 类就是org.apache.struts.action.Action。通 发 要自继承Aciton类, 自的Action。Struts Action ClassesActionServlet全部提currency1的请求控制器到RequestProcessor对象。RequestProcessor struts-config.xml文件请求URI 到Action标
4、示符。一个Action 类的角色,就客户请求 处理 的一个适配器(Adaptor),其 就是将请求” 。这样的 , 得客户请求Action类 以有 个点对点的映射。 Action类通 提供了其它的 , 如: (authorization)、 (logging) 据(validation)。public ActionForward execute(ActionMapping mapping,ActionForm form,javax.servlet.ServletRequest request,javax.servlet.ServletResponse response)throws java.
5、io.IOException,javax.servlet.ServletExceptionAction 为 的是execute() 。( ,以 的perform 在struts1.1中 ), 有一个execute() ,请 apidoc,在此在说明。当Controller 到客户的请求的“,在将请求转 到一个Action,如 这个存在,控制器 fi , 后 这个Action的execute() 。Struts Framework为 中的 一个Action类 一个。 为所有的 户 这一个,所以 必须定 的Action 类在一个 的 中。下 示了一个execute() 如何访问:Action的ex
6、ecute() ,客户自继承的Action子类,必须重写execute() , 为Action类在默 情况下是返回null的。Struts Action Mapping面讲到了一个客户请求是如何控制器转发处理的,但是,控制器如何什么样的信息转发到什么样的Action类呢?这就 要一”请求信息相对 的映射配置说明。在struts 中,这配置映射信息是存储在特定的XML文件( 如struts-config.xml)。 这配置信息在 启的“读入内存,供struts framework在期 。在内存中, 一个元素”org.apache.struts.action.ActionMapping类的一个对
7、。下表就 示了一个登陆的配置映射。面的配置表示:当 以通过/logonAction.do(此处假设配置的控制器映射为*.do)提currency1请求信息的“,控制器将信息com.test.LogonAction处理。 LogonAction的execute() 。同将Mapping所对 的LogonForm Bean信息入。其中name=LogonForm, 的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下 示。ActionForward 元素则表示了当Action的execute() 完毕或,控制器根据Mapping 将响 信息转到适当的地。
8、如面,如 客户登陆成 ,则 welcome forward,将成 信息返回到/welcome.jsp页面。在 的execute() 的结尾 以 下面的代码返回welcome forward。当 的welcome forward必须在action元素属性中定义,正如面所声明的那样。return (mapping.findForward(“welcome“);ActionForward对象是配置对象。这配置对象拥有独一无二的标识以允许它们按照有 义的名称如“success”,“failure”来索。ActionForward对象封装了 进的URL路径 请求处理器 于识别目标 。ActionForw
9、ard对象 自元素位于struts-config.xml。下面是一个Struts中元素子,属于元素范围。基于执请求处理器的execute() 的结 ,当递一个值匹配指定于元素中name属性的值的“,下一个 以在execute() 中 发 便的 org.apache.struts.action.ActionMapping.findForward()选择。ActionMapping.findForward() 既 它的本地范围又 全局范围提供一个ActionForward对象,该对象返回至RequestProcessor以RequestDispatcher.forward()或response.s
10、endRedirect() 下一个 。当元素有redirect=“false”属性或redirect属性存在的“,RequestDispatcher.forward()执;当redirect=“true”是,将sendRedirect() 。下举说明了redirect属性的 :如 redirect=true, URL 如/contextPath/path 为HttpServletResponse.sendRedirect()中解释URL采 ”/” 头相对于servlet容器根目录。如 redirect=false, URI 如/path 为ServletContext.getRequestDi
11、sptacher()采 虚拟目录相关URL。在此稍稍说一下有关global-forwards的概念。其在配置文件中描述了整个 以 的ActionForward,是仅仅是一个特定的Action。Struts ActionForm Bean捕表 据在面讲解ActionServlet,Action ClassesAction Mapping的“,我们提到了ActionForm Bean的概念。一个 的消息转 (或 说状态转 )的非久性 据存储,是由ActionForm Bean的负责保的。ActionForm派生的对象 于保存请求对象的 , 此它们 户紧密联 。一个ActionForm类Reques
12、tProcessor 。这是发生在 完成 进到一个URL,该URL为映射到控制器servlet是JSP相 的映射指定的表 属性的。在这个情况下,如 没有在指定的活范围内 到,RequestProcessor将尝试寻 致 一个新ActionForm对象的表 bean。该ActionForm对象在指定的活范围内 元素的name属性 到;RequestProcessor将随后重新安排表 属性, 请求 填充表 ,随即 表 对象的validate() 以履 器端 户输入。仅当ActionMapping对象中validate属性设为true,validate() ;这就是默 的为。request.getP
13、arameterValues(parameterName) 于得到一个String对象,它 来表 填充;的结 该是一个ActionErrors对象, org.apache.struts.taglib.html.ErrorsTag来 示 户。ActionForm 以 于为当 户保存即将一个 引 的中 模型状态。当一个表 对象RequestProcessor 到,它递到请求处理器的execute() 。一个ActionForm对象 以请求处理器 。表 对象 目的是提供中 模型状态 请求范围JSP;这将保对象 在有效性过期后仍 存在。默 的,所有的表 保存为 范围。 中表 对象脱 有效性的存在 致浪
14、 内存,同样的,请求处理器必须 保存在 中的表 对象的生 期。一个 的捕表 据的 是为 户currency1 的相关表 一个 独的表 bean。表 bean 以在 的“ 来储存 自定义标 的中 模型状态。在 中标 结合Java代码, 此要成一个的 ,web生 组主要处理标 , 发组主要处理Java代码。标 素 访问中 模型状态的 ;当访问 的对象或当通过 集 举这个 。 :在struts1.1中,ActionForm的 , 来(当 以 )。 了validator framework对整个 的表 据进 一 理。信息请 :http:/ 中,Struts提 到值对象(Value Object)。这样
15、将客户或 发,对 据状态”对象状态 currency1“的理解 。对于 一个客户请求,Struts framework在处理ActionForm的“,一 要 如下几个fifl:( )Action的映射,定Action中 配置了对ActionForm的映射()根据name属性, form bean的配置信息()Action的formbean的 范围,定在此范围下,是 有此form bean的。()假如当 范围下, 存在了此form bean的,是对当 请求来说,是同一 类型的,那么就重 。()则,就重新 一个form bean的()form bean的reset() (”) 对 的setter
16、,对状态属性值()如 validatede的属性设置为true,那么就 form bean的validate() 。(9)如 validate() 没有返回 何 ,控制器将ActionForm为 ,Action的execute() 并执。 : ActionFrom类继承的reset()validate() ,并 什么处理 ,所以有必要自重新 。Struts的其组件Struts framework本提供了 的组件或sub framework,便的 发在其 web层的 。 如upload,collections ,logging。让我们来个 重要的组件:validationg frameworks
17、truts taglib。有关其组件请 Struts 户(http:/jakarta.apache.org/struts/userGuide)。Validation Framework for Struts在struts1.1中,新 了validation framework。 了对form 据提currency1的。将本 要在ActionFrom Bean的validate()进的通过配置文件的描述进。有关其信息,请 http:/ 。个 对于型 以采 这 配置式,但是对于 中有 web层表 的 ,并 求 的,validation framework 重 发 、 。 以 validation
18、framework的Javascript Validator Tag。Struts TagLibstruts提供了一组 的自定义标 (TagLib), 以 户 面的过 。目 包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。有关Struts Taglib的结 , 以 面有关Cutomer Tag Lib的介绍,有关 ,请 BeanUtils这个组件的全称是Bean Introspection Utilites。是属于Jakarta Commons 目组的。主要是 javabean的属性的(getter,s
19、etter), 提供一 态定义访问bean的属性。有关信息,请 。http:/jakarta.apache.org/commons/beanutils.html如 位对这面有 , 以 一有关java 射(Reflectio)面的 。Collections这个组件主要是提供了一集合或 表对象,在有的java collections framework的基进了。 请 :http:/jakarta.apache.org/commons/collections.html 以 http:/cvs.apache.org/viewcvs/checkout/jakarta-commons/collections/STATUS.html?rev=1.13Digester这个组件 成中文的 是“ ”。其主要 是根据xml配置文件, 的一java类对象。Digester 指定XML”java对象 映射模型, 允许客户 定制映射则(rules)。 请 http:/jakarta.apache.org/commons/digester.html