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类的子类。

配置动态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。

 

动态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);

}

}

 

访问动态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)方法用于为给定的属性赋值。

 

动态ActionForm的表单验证

    DynaActionForm基类的validate()方法没有提供任何默认的验证行为。可以定义扩展DynaActionForm的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初中,即以配置来替代编程。幸运的是,可以采用另一种验证机制,即Validator框架来完成验证。Validator框架允许采用特定的配置文件来为动态ActionForm配置验证规则。

posted on 2015-07-26 21:10  幻林的地盘  阅读(164)  评论(0)    收藏  举报

导航