1. 配置
目前使用的版本是Struts1.2.8(下载地址:http://struts.apache.org/download.cgi),里面有validator-rules.xml和validator.xml两个文件,在使用Validator之前,需要先配置一些东西。
1)必要的包:
将Struts发行包中的commons-validator.jar和jakarta-oro.jar
这两个文件放到Web应用的WEB-INF/lib目录中。
2)在struts-config.xml中设置插件:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
value值用来指定验证规则的文件,多个验证规则文件要用逗号分割。
3)配置验证规则:
Validator框架有两个重要的配置文件:
<1>``validation-rules.xml文件,
这个配置文件包好了一组可供应用程序使用的全局验证规则。
这个文件是所有应用程序都使用的,任何Struts应用程序也都能
使用。除非打算修改或扩展这组规则,否则无需修改这个文件!
注意1:需要在资源包(ApplicationResources.properties)中加上一下的“键-值”:
## label
label.userName=User name
label.password=Password
## key-value
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
## Errors
error.username.required=<li>Your ID is wrong.</li>
error.password.required=<li>Your password is wrong.</li>
errors.header=<h3><font color="red">Validation Error</font></h3>
errors.footer=<hr>
因为,验证出错的时候,系统会自动在资源包中查找对应的错误消息,
比如:required验证规则出现错误时,就会输出“errors.required”的值。
注意2:在Struts 1.2.8中,验证类使用的是:“org.apache.struts.validator.FieldChecks”,
以前使用的是“org.apache.struts.util.StrutsValidtor”,
只要是从struts 1.2.x发行包中拷贝的“validation-rules.xml”文件,就可以保证是正确的。
<2>``validation.xml文件
这个文件是专门用来验证页面指定的Field。
注意1:这个文件是由“<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">”来管理其语法的。
(因为这个没有找到,耽误了很长时间,每次起动服务器都抛出异常“must match DOCTYPE root "null"”)
2. 实现
这次就记录一下对页面上某个Field具体是如何验证的。
这个功能是通过validation.xml文件实现的,
其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。这个value属性用来指定validator-rules文件和具体的验证文件。
1)根元素:
validators.xml文件的“根元素(Root)”是form-validation,
意味着整个文件的内容包含在“<form-validation>”和“</form-validation>”之间,
2)元素global:
这个东西包含constant子元素,用来定义一个全局的“验证限制”,
以便在这个文件的其他地方使用这些验证规则。
例如:
<global>
<constant>
<constant-name>userName</constant-name>
<constant-value>^/s*[/w-]{0,30}$</constant-value>
</constant>
<constant>
<constant-name>password</constant-name>
<constant-value>^/s*[./w@#!$%^*()-]{6,20}/s*$</constant-value>
</constant>
<constant>
<constant-name>email</constant-name>
<constant-value>^/s*([A-Za-z0-9]+(/./w+)*@([/w-]+/.)+/w{2,3})/s*$</constant-value>
</constant>
</global>
这个例子就定义了一个全局的验证规则,名字是“zip”,具体的规则由“constant-value”指出。
3)formset元素:
这个可能是这个文件最重要的元素了,
主要负责的就是指定对哪个Field进行验证以及验证规则。
例如:
<formset>
<constant>
<constant-name>zip</constant-name>
<constant-value>^/d{6}$</constant-value>
</constant>
<form name="userLogin">
<field
property="userName"
depends="required,mask,minlength">
<arg0 key="label.userName"/>
<arg1 name="minlength" key="${var:minlength}" resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>${userName}</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>4</var-value>
</var>
<msg name="mask" key="error.username.required"/>
</field>
</form>
</formset>
<1>在formset元素中仍然可以定义验证规则(“constant”),但是,它不是全局的!
这里定义了一个为“zip”的验证规则(这个例子与global的例子没有关系,不要混淆)。
<2>在formset元素中可以定义一个或多个“form”子元素,这个form子元素指的是“from-bean”,
name用于指定被验证的是哪个form-bean,具体的意思一会儿再提。
<3>form子元素中也可以包括一个或多个“field”子元素,这个用来指定这个form-bean中,
哪个field被验证。
<3.1>field元素中的property:指定用来验证的field名;
<3.2>field元素中的depends:指定要采用那些验证规则对其进行验证;
<3.3>field元素中可以包含msg元素(这个例子没有用到),这个元素有三个属性:
name:指定这个message用于哪条规则;
key:这个值应该是资源包中一个可用的“键”;
resource:是一个布尔值,用来说明key中指出的数值是否为资源包中的“键”。如果这个值是“false”,msg中的内容就是key中的字符串,而不是资源包中的值。
<3.4>field元素中可以包括一个到四个arg子元素,用于对应资源包中errors.XXX中的代换参数,
arg0对应{0},arg1对应{1}……,这个子元素包含的属性与msg一致。
小结:
var可以定义验证规则,比如:userName行;
var可以引用在constant中定义的验证规则(包括global中定义的),比如:mask行;
var可以定义要显示的数据,在key中引用这个值,比如minlength行。
写在最后的,刚才在介绍form子元素时,并没有具体说明它的name属性具体是如何指定要验证的form-bean的。
这里进行说明一下:
1、如果form-bean是ValidatorAction子类的话,系统将把struts-config中action元素的path属性传递给Validator,此时,Validator中form子元素的name属性应该对应 action元素的path属性。
2、如果form-bean是DynaValidatorForm子类的话,系统将把struts-config 中action元素的name属性传递给Validator,此时,Validator中form子元素的name属性应该对应action元素的 name属性。即,与form-bean的名字是一致的!
^_^ **!
附:有关正则表达式,请下载RegexBuddy工具测试(我用的是2.0.1版本,下载地址:http://www.naf.com.cn/soft/81711.htm)
补充一点:
1. 一些朋友可以建立了多个资源包文件,像<msg name="mask" key="error.username.required"/>引用的是默认的资源包ApplicationResources.properties中的消息资源,如果要引用其它资源包(例如:LabelResources.properties)中的消息资源,就应该用<msg name="mask" key="error.username.required" bundle="label"/>格式,并且在struts-config.xml中作如下定义:
<message-resources key="label" parameter="com.nyhr.struts.LabelResources" />
2. 还有,我们在实际应用中,最好将DTD文件设置为本地的,比如validation.xml中的
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
改为
<!DOCTYPE form-validation SYSTEM "dtd/validator_1_2_0.dtd" >
这样系统在启动加载时,就会从本地加载DTD文档,以避免网络通信不必要的麻烦,但是关于validator_1_2_0.dtd文件的路径在这里有一点需要说明的,本来validator_1_2_0.dtd文件放在WEB-INF/dtd/目录下就可以了,不过在应用了补充1条款后,好像要放在$Tomcat_Home$/bin/dtd/下,Tomcat启动才不会报错(当然,如果继续放在WEB-INF/dtd/目录下,就算启动报错,也不影响系统的使用),目前还不明白真正的原因。