struts动态ActionForm
在Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据。自定义的ActionForm必需符合JavaBean规范,并继承Struts的ActionForm类,同时,用户可以有选择地覆盖两个方法:reset()和validate()。
ActionForm的以上特性可以简化Web应用的开发,因为它可以协助自动进行表示层的数据验证。ActionForm的唯一缺点时对于大型的Struts应用,必需以编程的方式创建大量的ActionForm类,如果HTML表单的字段发生变化,就必需修改并重编译相关的ActionForm类。
Struts 1.1对此做了改进,引入了动态ActionForm类的概念。Struts框架的DynaActionForm类及其子类实现了动态ActionForm,DynaActionForm类是ActionForm类的子类。
1 配置动态ActionForm
动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,没有必要编写额外的程序来创建具体的ActionForm类。配置动态ActionForm的方法为:在Struts配置文件中配置一个<form-bean>元素,将type属性设置为DynaActionForm或它的某个子类的全名。
<form-bean>的<form-property>子元素用来设置动态ActionForm的属性。<form-property>元素的name属性指定属性名,type指定属性类型,可以把动态ActionForm的属性设为以下Java类型:
· java.lang.BigDecimal
· java.lang.BigInteger
· java.lang.Boolean
· java.lang.Byte
· java.lang.Character
· java.lang.Class
· java.lang.Double
· java.lang.Float
· java.lang.Integer
· java.lang.Long
· java.lang.Short
· java.lang.String
· java.sql.Data
· java.sql.Time
· java.sql.Timestamp
如果表单的字段值为Java基本类型,在配置时应该用响应的包装类型来代替,例如int类型的包装类型为Integer。
2 动态ActionForm的reset()方法
DynaActionForm基类提供了initialize()方法,它把表单的所有属性恢复为默认值。表单属性默认值由<form-bean>的<form-property>子元素的initial属性来决定。如果没有设置initial属性,则表单属性的默认值由其Java类型来自动决定,例如对象类型的默认值为null,整数类型的默认值为0,boolean类型的默认值为false。
DynaActionForm基类的initialize()方法的代码如下:
public void initialize(ActionMapping mapping) {
String name = mapping.getName();
if (name == null) {
return;
}
FormBeanConfig config =
mapping.getModuleConfig().findFormBeanConfig(name);
if (config == null) {
return;
}
FormPropertyConfig props[] = config.findFormPropertyConfigs();
for (int i = 0; i < props.length; i++) {
set(props[i].getName(), props[i].initial());
}
}
DynaActionForm基类的reset()方法不执行任何操作,其代码如下:
public void reset(ActionMapping mapping, HttpServletRequest request) {
; // Default implementation does nothing
}
如果希望Struts框架在每次把表单数据组装到动态ActionForm中之前,先把所有的属性恢复为默认值,可以定义一个扩展DynaActionForm类的子类,然后覆盖其reset()方法,在reset()方法中只要调用initialize()方法即可,代码如下:
public class MyDynaActionForm extends DynaActionForm {
……
public void rest(ActionMapping mapping, HttpServletRequest request) {
initialize(mapping);
}
}
3 访问动态ActionForm
Action类和JSP都可以访问动态ActionForm,使用方法与标准ActionForm大致相同,只有一点小差别。如果使用标准ActionForm对象,在标准ActionForm中针对每个属性都提供了get/set方法,来读取或设置属性。
而DynaActionForm把所有的属性保存在一个Map类对象中,并提供了下面的用于访问所有属性的通用方法:
public Object get(String name)
public void set(String name, Object value)
get(String name)方法根据指定的属性名返回属性值;set(String name, Object value)方法用于为给定的属性赋值。
4 动态ActionForm的表单验证
DynaActionForm基类的validate()方法没有提供任何默认的验证行为。可以定义扩展DynaActionForm的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初中,即以配置来替代编程。幸运的是,可以采用另一种验证机制,即Validator框架来完成验证。Validator框架允许采用特定的配置文件来为动态ActionForm配置验证规则。
浙公网安备 33010602011771号