用FormTag初始化ActionForm对象
本节早前提到,HTML表单中动作URL被映射到一个<action>配置,并轮流被映射到一个<form-bean>配置。FormTag中由action属性制定的URL被FormTag转换为一个在部署描述符中<url-pattern>确定的路径结构URL。对于扩充的映射,这意味着资源扩展和<url-pattern>指定的一样。因此,一个表单URL中 editCustomerProfile?customerType=preferred被转换为/editCustomerProfile.do?customerType=preferred。FormTag调用RequestUtils.createActionForm(…)方法,查找一个ActionFormBean配置对象(ActionFormBean 是<formbean>元素的运行时表现),其名称匹配指定的相应<action>的名称。一个新的ActionForm实例使用<form-bean>元素type属性被建立;当ActionForm实例在指定的活动范围内未找到时,一个新的实例被建立,否则FormTag调用已存在的表单bean的ActionForm.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的版本说明和更新来补足这章的内容。
参考
[Core] Core J2EE Patterns by Deepak Alur et. al. (Prentice Hall, 2001)
[Gof] Design Patterns by Erich Gamma et. al. (Addison-Wesley, 1995)
完, 头一次翻译,也是为了应付考试呀~
翻得不好,大家见谅~
冰云翻译,转载请告知。