当你HTML form中添加了一个属性,需要在DynaActionForm中添加一个属性时,就不需要去修改具体的ActionForm类,只需要在配置文件中添加一个form-property元素即可,大大提高了可扩展能力。
前面我们已经了解到,ActionForm的reset()方法默认不进行任何操作,在DynaActionForm中,reset()方法默认将所有属性设置为默认值,如果在配置文件中没有为该属性设置默认值,将会按照java编程语言的规范根据属性的类型为其进行初始化,例如:数字(int ,double,float)的将会初始化为0,Ojbect类型将为初始化为null。
注意:在配置文件中定义的form-property的type属性,其值为一个java类名,因此对于java语言中的主类型,如ini,long必须定义为java.lang.Int,java.lang.Long,其它主类型依次类推。
1.1.1.1.1 使用DynaActionForm执行校验规则
同ActionForm一样,DynaActionForm也没有提供validate()方法的默认操作,幸运的是,Struts提供了另外一种框架来帮助大家解决校验的问题,这就是Struts Validator框架。Struts Validator 框架由David Winterfeldt编写,现在已经成为Struts主分发的一部分,它提供基于规则的校验,对于常用的校验,如必填项目,email,电话等等提供了现成的规则,只需要通过配置文件进行配置即可。关于Struts Validator框架的详细介绍,见后续章节。
1.1.1.2 Validator 框架
Struts允许在ActionForm的validator()方法中添加校验代码,对用户输入的数据进行规则校验,这能很好地工作,但是,这存在一些限制,举个简单的例子,一个必填项现在不是必填项了,要满足这个简单的需求就需要更改ActionForm类的validator()方法,再进行重新编译,很麻烦。本节我们来学习Validator框架,看它是如何解决校验问题的。
1.1.1.2.1 Validator的安装、配置
Validator目前是Jakarta Commons 项目的一部分,它也被包含在Struts主分发里面,可以直接使用Struts中自带的Validator库,也可以去网站上下载http://jakarta.apache.org/commons/。
Validator需要一些其它库的支持,例如Jakarta ORO,不过没关系,Struts分发包里面都包含了,你只需要按照第2章介绍的将Struts安装到你的应用中,就一切ok。
1.1.1.2.1.1 配置校验规则
前面提到过,Validator是通过校验规则来实施校验,这些校验规则被配置在配置文件中,这意味着不需要修改源代码就可以方便地更改校验规则,是不是感觉很不错?Validator所需要的配置文件有两个:validation-rules.xml和validation.xml。
1.1.1.2.1.2 validation-rules.xml
在validation-rules.xml文件中配置了一些全局性的校验规则,使得你在应用程序中使用校验而不用关注实现细节。这个配置文件是Validator框架自带的,可以用在所有Struts应用中。它默认配置了许多很常用的规则,一般来说,不用去更改它,除非需要扩展或修改这些默认的校验规则。
建议:即使你需要扩展一些规则,也不要去修改validation-rules.xml,而是通过新的配置文件去定义你所扩展的校验规则。
validator-rules_1_1.dtd定义了validation-rules.xml文件的结构,根元素是form-validation,它包含一到多个global元素,global元素包含一到多个validator元素。
每一个validator元素定义了一个唯一的校验规则。下面是validation-rules.xml文件中的一个片断,用来定义必填项(required)校验规则:
<validator
name="required"
classname="org.apache.struts.util.StrutsValidator"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
</validator>