Struts快速入门(二)

 

使用ActionForward导航

       ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照有意义的名称如“success”,“failure”等来检索。ActionForward对象封装了向前进的URL路径且被请求处理器用于识别目标视图。ActionForward对象建立自<forward>元素位于struts-config.xml。下面是一个Struts<forward>元素例子,属于<action>元素范围。

<action path="/editCustomerProfile"

type="packageName.EditCustomerProfileAction"

name="customerProfileForm" scope="request">

<forward name="success" path="/MainMenu.jsp"/>

<forward name="failure" path="/CustomerService.jsp"/>

</action>

       基于执行请求处理器的execute(…)方法的结果,当传递一个值匹配指定于<forward>元素中name属性的值的时候,下一个视图可以在execute(…)方法中被开发者用方便的方法org.apache.struts.action.ActionMapping.findForward(…)选择。ActionMapping.findForward(…)方法既从它的本地范围又从全局范围提供一个ActionForward对象,该对象返回至RequestProcessorRequestDispatcher.forward(…)response.sendRedirect(…)调用下一个视图。当<forward>元素有redirect=false属性或redirect属性不存在的时候,RequestDispatcher.forward(…)被执行;当redirect=“true”是,将调用sendRedirect(…)方法。下例举例说明了redirect属性的用法:

      <forward name="success" path="/Catalog.jsp" redirect="true"/>

struts-config.xml<controller>元素还提供另一个特性以控制<forward>元素的的name属性如何被解释。该<controller>元素用于联合<action>元素中input属性,如下所示:

<action path="/editCustomerProfile"

type="packageName.EditCustomerProfileAction"

name="customerProfileForm"

scope="request"

input="profile">

<forward name="profile" path="/CustomerProfile.jsp"/>

<forward name="success" path="/MainMenu.jsp"/>

</action>

<controller>

<set-property property="inputForward" value="true"/>

</controller>

       上述的<action>元素包含一个input属性及一个向前名称;该前进名称与<forward>中的相同。在上述的<controller>配置中,当ActionForm.validate(…)返回一个非空或非nullActionErrors对象,RequestProcessor将选择<forward>元素,其name属性与<action>元素的input属性拥有相同的值;除非用子类取代RequestProcessor,该行为是确认遇到错误的标准行为。对下面的<controller>元素声明,当ActionForm.validate(…)返回一个非空或非nullActionErrors对象,input属性提供一个向前的URL以代替向前发生ActionForward的名称。在inputForward属性不存在时,这是默认的配置。

<controller>

<set-property property="inputForward" value="false"/>

</controller>

       前进指向特定的路径,如果路径中没有”/” 就加上。对于前进或重定向,Struts中的URL在内部被RequestProcessor用下面的结构建立。

如果redirect=true, URL建立如/contextPath/path因为HttpServletResponse.sendRedirect(…)中解释URL采用”/”开头相对于servlet容器根目录。

如果redirect=false, URI建立如/path因为ServletContext.getRequestDisptacher(…)采用虚拟目录相关URL

 

捕获表单数据

       JSP规范提供了一个标准方法以在请求时从JavaBean提取和保存表单数据,使用<jsp:useBean><jsp:setProperty>。然而这种方法导致了在表示层和JavaBeans间产生很强的耦合;此外HTML文档创作者不得不明白这种组件并且知道它们在页面中正确地用法。因为JavaBean可以被<jsp:useBean>标签或被另一个服务器组件建立和放置在指定的范围,那样可能在不同的组件共享JavaBean中产生bean的生命周期管理问题。Struts提供一个机制以提取,保存和验证表单数据;同时它克服了<jsp:useBean><jsp:setProperty>的缺点。下面是一对新的<action><form-bean>元素。

<form-bean name="customerProfileForm" type="packageName.customerProfileForm"/>

 <action path="/editCustomerProfile" type="packageName.EditCustomerProfileAction" name="customerProfileForm" scope="request"/>

       上述例子映射一个packageName.customerProfileForm类型JavaBeanname = customerProfileForm(唯一标识)到一个<action>元素的name = customerProfileForm;请求处理器被提交请求的路径/editCustomerProfile唯一标识。该表单建立和使用的语义用下面的静态模型举例说明:

 

   图略

 

首先,我们将浏览这些表单处理语义直到使用简单JavaBeans对象。这些对象作为ActionForm对象被实现。我们随后将讨论使用DynaActionForm对象进行表单处理,可以在请求时支持属性的动态集合。

 

 

FormTag初始化ActionForm对象

       本节早前提到,HTML表单中动作URL被映射到一个<action>配置,并轮流被映射到一个<form-bean>配置。FormTag中由action属性制定的URLFormTag转换为一个在部署描述符中<url-pattern>确定的路径结构URL。对于扩充的映射,这意味着资源扩展和<url-pattern>指定的一样。因此,一个表单URL editCustomerProfile?customerType=preferred被转换为/editCustomerProfile.do?customerType=preferredFormTag调用RequestUtils.createActionForm(…)方法,查找一个ActionFormBean配置对象(ActionFormBean <formbean>元素的运行时表现),其名称匹配指定的相应<action>的名称。一个新的ActionForm实例使用<form-bean>元素type属性被建立;当ActionForm实例在指定的活动范围内未找到时,一个新的实例被建立,否则FormTag调用已存在的表单beanActionForm.reset(…)方法以清除并准备接受下一个请求的表单数据。该活动范围被<action>元素中scope属性所指定;新ActionForm实例或已存在的重新初始化的实例被使用name属性保存在指定的活动范围内

 

ActionForm保存表单数据

       ActionForm派生的对象用于保存请求对象的参数,因此它们和用户紧密联系。一个ActionForm的子类是一个拥有存取HttpServletRequest对象参数属性的方法JavaBean。如果ActionForm对象被FormTag建立,那么在后来的FormTag表单翻译请求中,RequestProcessor将从制定的活动范围访问表单;欲取得的表单被相关的动作映射所标识。RequestProcessor将随后重新安排表单属性,用请求时参数填充表单,随即调用表单对象的validate(…)方法以履行服务器端用户输入验证。仅当ActionMapping对象中validate属性被设为true时,validate(…)方法被调用;这就是默认的行为。request.getParameterValues(parameterName)被用于得到一个String[]对象,它用来表单填充;验证的结果应该是一个ActionErrors对象,用org.apache.struts.taglib.html.ErrorsTag来显示验证错误给用户。ActionForm也可以被用于为当前用户保存即将被一个视图引用的中间模型状态。

 

       一个ActionForm类也可以被RequestProcessor建立。这是发生在已完成向前进到一个URL,该URL为映射到控制器servlet而不是JSP和相应的动作映射指定的表单属性的。在这个情况下,如果没有在指定的活动范围内找到,RequestProcessor将尝试寻找可能导致创建一个新ActionForm对象的表单bean。该ActionForm对象在指定的活动范围内被用<action>元素的name属性找到;当一个表单对象被RequestProcessor找到,它被传递到请求处理器的execute(…)方法。一个ActionForm对象也可以被请求处理器建立。表单对象建立目的是提供中间模型状态给使用请求范围JSP;这将确保对象不会在有效性过期后仍然存在。默认的,所有的表单都被保存为会话范围。会话中表单对象脱离有效性的存在可能导致浪费内存,同样的,请求处理器必须跟踪保存在会话中的表单对象的生命周期。一个好的捕获表单数据的实践是为横跨多用户交互的相关表单用一个单独的表单bean表单bean也可以在反馈的时候用来储存能够被自定义标签改变的中间模型状态。在视图中标签用法避免结合Java代码,因此要成一个好的任务划分,web生产组主要处理标志,而应用开发组主要处理Java代码。标签因素退出访问中间模型状态的逻辑;当访问嵌套的对象或当通过聚集列举时这个逻辑可能很复杂。

 

用动态属性建立ActionForm

       一个DynaActionForm对象是一个拥有动态属性集合的对象。DynaActionForm扩展了ActionForm,它的用法允许通过在struts-config.xml声明建立一个表单对象,如下:

<form-bean name="logonForm"

type="org.apache.struts.action.DynaActionForm">

<form-property name="username" type="java.lang.String"/>

<form-property name="password" type="java.lang.String"/>

</form-bean>

    RequestProcessor用和ActionForm相同的方式建立、填充并验证了DynaActionForm,例如,请求对象的参数被以<form-bean>元素中特定的动态属性填充到DynaActionForm;其他的参数简单类似。

 

总结

       为一个基于请求/响应的HTTP协议实现MVC语义(semantics)需要付出重大的时间和努力。选择一个合适的架构以解决该问题提供一个领先的项目,允许架构师和开发者关注于事务语义而不是整合语义。Struts也提供充足的模型如Struts Validator以声明表单验证,Tiles以聚集合成视图;这些模型增强了架构而且大大简化了设计和开发一个应用的任务。Struts更多的信息和相关配置及安装的说明可以在http://jakarta.apache.org/struts/userGuide/index.html找到。因为Struts开发是一个正在进行的开发,或许就在你读这篇文章的时候,一些实现也会更改,因此,最好的是用发布于http://jakarta.apache.org/struts版本说明和更新来补足这章的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值