在使用Validator验证框架时,需要用到二个基于XML的配置文件进行验证规则的配置,一个是validator-rules.xml,另一个是validation.xml。这两个文件应该部署在相应的WEB应用中的WEB-INF文件夹下。此外validator还应在struts-config.xml中进行配置。
在Struts-config.xml中配置Validator
Validator框架是作为一个Struts插件配置到Struts应用中的,即Struts扩展中的PlugIn机制。通过在Struts配置文件中配置Validator插件,Struts应用在启动的时候就能够知道Validator框架正在被使用,加载并初始化Validator框架。
以下为示例:
<!-- 验证插件 -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
<set-property property="stopOnFirstError" value="false" />
</plug-in>
stopOnFirstError属性的作用是指定客户端JS验证时是在遇见第一个时就返回还是全部处理完后将所有错误全部返回。<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
<set-property property="stopOnFirstError" value="false" />
</plug-in>
validation.xml的配置
validation.xml 文件是Validator框架需要的另一个配置文件。该文件是特定于应用程序的,由开发人员自己来创建。它描述了那些具体应用中的ActionForm所使用的validator-rules.xml文件中的有效性验证规则。通过ActionForm在validation.xml文件中配置所需要的验证规则,开发人员就不必将 验证的逻辑硬编码ctionForm的内部。一个简单的validation.xml文件代码如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<!-- global元素允许开发人员配置可以用在其他部分中的constant元素,也就是全局常量
formset也可以有contant元素,定义局部常量-->
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^[a-zA-Z]*$</constant-value>
</constant>
</global>
<formset>
<!-- struts-config formBean中的name属性 -->
<form name="dynaFormForm">
<!-- 视图组件中要验证的属性 验证规则 在validator-rules.xml中定义-->
<field property="userName" depends="required,minlength,maxlength">
<arg key="lable.userName" position="0"/><!-- 在资源文件中定义 -->
<!-- 在本文件中设定最小值 false表明可在本文件中直接定义值-->
<arg key="${var:minlength}" resource="false" position="1"/>
<var> <!-- 在arg中访问 var的形式 ${var:minlength}-->
<var-name>minlength</var-name>
<var-value>3</var-value>
<!-- var元素用来向验证规则传递参数 -->
</var>
<!-- 在资源文件中设定最大值 -->
<arg key="lable.userName.maxlength" resource="true" position="2"/>
</field>
<field property="userPwd" depends="required,mask">
<!-- field元素的msg子元素指定验证规则对应的消息文本,该消息文本将 替代默认的消息文本,
即validatior-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中某个消息资源的关键字。 -->
<msg name="mask" key="registerForm.password.maskmsg"/>
<!-- arg元素可以来向消息文本传递参数。 -->
<arg key="lable.userPwd" />
<arg key="lable.mask" resource="true" position="1"/>
<!--
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
或者用${zip}代码value内容
</var>-->
</field>
</form>
对应的资源文件如下:<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<!-- global元素允许开发人员配置可以用在其他部分中的constant元素,也就是全局常量
formset也可以有contant元素,定义局部常量-->
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^[a-zA-Z]*$</constant-value>
</constant>
</global>
<formset>
<!-- struts-config formBean中的name属性 -->
<form name="dynaFormForm">
<!-- 视图组件中要验证的属性 验证规则 在validator-rules.xml中定义-->
<field property="userName" depends="required,minlength,maxlength">
<arg key="lable.userName" position="0"/><!-- 在资源文件中定义 -->
<!-- 在本文件中设定最小值 false表明可在本文件中直接定义值-->
<arg key="${var:minlength}" resource="false" position="1"/>
<var> <!-- 在arg中访问 var的形式 ${var:minlength}-->
<var-name>minlength</var-name>
<var-value>3</var-value>
<!-- var元素用来向验证规则传递参数 -->
</var>
<!-- 在资源文件中设定最大值 -->
<arg key="lable.userName.maxlength" resource="true" position="2"/>
</field>
<field property="userPwd" depends="required,mask">
<!-- field元素的msg子元素指定验证规则对应的消息文本,该消息文本将 替代默认的消息文本,
即validatior-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中某个消息资源的关键字。 -->
<msg name="mask" key="registerForm.password.maskmsg"/>
<!-- arg元素可以来向消息文本传递参数。 -->
<arg key="lable.userPwd" />
<arg key="lable.mask" resource="true" position="1"/>
<!--
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
或者用${zip}代码value内容
</var>-->
</field>
</form>
lable.userName=用户名
lable.userName.maxlength=5
lable.userPwd=密码
lable.mask=^[a-zA-Z]*$
registerForm.password.maskmsg=测试消息
validation.xml中已经加了大量注释。lable.userName.maxlength=5
lable.userPwd=密码
lable.mask=^[a-zA-Z]*$
registerForm.password.maskmsg=测试消息
而针对上例子的Struts-config.xml配置文件中的DynaActionForm配置如下:
<!-- 动态FORM演示 -->
<form-bean name="dynaFormForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userName" type="java.lang.String" />
<form-property name="userPwd" type="java.lang.String" />
</form-bean>
注意,要使用验证框架的FormBean必须是与Validator匹配的类:ValidationForm类或DynaValidationForm类,及其子类ValidatiorActionForm和DynaValidatiorActionForm。它们都是ActionForm类的子类。<form-bean name="dynaFormForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userName" type="java.lang.String" />
<form-property name="userPwd" type="java.lang.String" />
</form-bean>
我这里用的是动态的FormBean,因此类型我由org.apache.struts.action.DynaActionForm改为 org.apache.struts.validator.DynaValidatorForm,如果要验证普通的非动态的ActionForm如下:
<!-- 验证框架要用在非动态FormBean上时,该FormBean必须为ValidatorForm子类 -->
<form-bean name="studentForm" type="struts.form.StudentForm" />
<form-bean name="studentForm" type="struts.form.StudentForm" />
我们就应该让StudentForm类继承自ValidationForm,否则达不到验证效果!