在Struts中,Validator的作用非常大,他可以让用户从繁琐的页面验证工作中脱身,让页面验证工作放到配置文件里去做,Struts已经内置了如下这些我们经常使用的校验器:
· validateByte 检查值能够安全地转换为byte
· validateCreditCard 检查值是一个有效的信用卡号码
· validateDate 检查值是一个有效的日期
· validateDouble检查值能够安全地转换为double
· validateEmail 检查值是一个有效的Email地址
· validateFloat 检查值能够安全地转换为double
· validateInteger 检查值能够安全地转换为int
· validateLong检查值能够安全地转换为long
· validateMask检查值符合掩码规则,掩码采用规则表达式的方式
· validateMinLength 检查值的长度大于等于指定长度
· validateMaxLength检查值的长度小于指定长度
· validateRange检查值的有效范围在指定范围内
· validateRequired检查值不为null或长度>0
· validateShort 检查值能够安全地转换为short
这些校验器差不多已经囊括了大多数的需要验证的东西,今天我们大致回顾一下Validator如何在Struts中应用,有时间,我会展示一下实际项目中又是如何做的。
第一步:启用Validator插件
Validator插件已经内置于Struts中,但是默认状态下是没有被启用的,我们首先是要修改struts-config.xml文件,在文件最后(记住,是最后哟~!),增加如下代码来启用之:
<set-property property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
第二步:生成ActionForm Bean
java.lang.Object
org.apache.struts.action.ActionForm
org.apache.struts.validator.ValidatorForm
org.apache.struts.validator.ValidatorActionForm
java.lang.Object
org.apache.struts.action.ActionForm
org.apache.struts.action.DynaActionForm
org.apache.struts.validator.DynaValidatorForm
org.apache.struts.validator.DynaValidatorActionForm
由以上的继承关系,我们可以清楚地看到ValidatorActionForm/DynaValidatorActionForm都是继承于ActionForm,我们在实现自己的ActionForm Bean的时候,继承ValidatorActionForm/DynaValidatorActionForm即可。里面的内容与我们平时的ActionForm Bean无异。
第三步:配置Validator
现在,准备工作已经结束,我们可以根据第一步的配置,在WEB-INF下新建validation.xml文件,
< form name ="/customer/cust001" >
< field property ="userSel" depends ="required" >
< arg0 key ="番号選択" resource ="false" />
</ field >
< field property ="recptNumInput" depends ="needvalidate,intRange" >
< arg0 key ="受付番号" resource ="false" />
< arg key ="prompt.min" position ="1" />
</ field >
< field property ="max" depends ="intRange,maxlength" >
< arg key ="prompt.max" position ="0" />
< arg name ="maxlength" key ="${var:maxlength}" resource ="false" position ="1" />
< var >
< var-name > maxlength </ var-name >
< var-value > 10 </ var-value >
</ var >
</ field >
</ form >
</ formset >
现在大致介绍一下各个元素的意思。
<form>不用说,就是定义是要验证哪个form的。
<field>是用来判断要验证哪个字段,depends属性,意思是该字段要依赖于哪个验证器。
<arg> 它的作用是替换信息中的某一部分,或者为验证方法提供必需的参数值。
可以两种方式传入参数,第一,<arg0>,<arg1>...(最多四个) 第二,用<arg>里的position属性来设置传入的位置。
key属性指定了一个资源文件的关键字,用来替换掉msg中需要替换的部分。如果你想设置一个明确的文本而不是资源文件的关键字,则可以将resource属性设置为false,这种情况下,可以将key属性设置为一个明确的文本,如“身份证”。
name属性指定了msg将使用的校验规则名称,属性值必须是在validation-rules.xml 文件中定义的校验规则。
注:对于一个field,需要的验证规则有时不止一个,例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都相同,那么只要定义<arg0...、<arg1...等等即可。但是如果它们需要的参数的个数、名称和顺序不同怎么办,如果我们对于第一个输入参数只定义一个arg0,那么这个arg0用于哪个验证消息,因此这时必须通过arg标签的name属性来表示该参数所服务的验证。
field 元素包含的最后一个子元素是var 元素,field 元素可以包含0到多个var元素,var 元素可以设置该field所用到的校验规则的参数,var-name 参数名,var-value指定参数值。
<msg> 与 <arg> 相似,三个属性分别如下:
< msg name ="date,daterange" key ="80000" resource ="true" />
< arg0 key ="開始日時" resource ="false" />
< var >
< var-name > date_mode </ var-name >
< var-value > YYYYY </ var-value >
</ var >
</ field >
name属性与<arg> 的同名属性相同。
key属性指定了一个资源文件的关键字,当校验失败是,该关键字所代表的信息将会添加到ActionError 中。
resource属性与<arg> 的同名属性相同。
这样,所有的概念都已经讲清楚了。下面看看实际项目是如何做的。
第一,可以为不同的业务逻辑配置多个validator文件。
< plug-in className ="org.apache.struts.validator.ValidatorPlugIn" >
< set-property property ="pathnames"
value ="/WEB-INF/struts-config/validator-rules.xml,
/WEB-INF/struts-config/validation-login.xml,
/WEB-INF/struts-config/bankuser/validation-tekou.xml,
/WEB-INF/struts-config/bankuser/validation-kirin.xml,
/WEB-INF/struts-config/enduser/validation-qbs.xml" />
</ plug-in >
<!-- ================= 業務名: ValidatorPlugIn・終了============================== -->
第二,在每一个validation文件中可以自定义规则。
classname ="com.ws.kokey.util.validator.UnitValidator"
method ="validateCharacterFull"
methodParams ="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg ="全角のチェック" >
</ validator >
具体实现,我们可以在定义的那个class里面写好。
好了,今天不能再写了,从上午都已经写到下午14:30了。下次再写。