Struts validator 动态验证框架
1) struts数据的检验分成客户端检验与服务器检验。客户端检验是避免用户输入非法的的数据 , 而服务器端检验通常是把
用户输入的正确数据与数据库的数据进行对比,然后依然业务逻辑进行检验
2) 如果要进行服务器端检验可以在Action中进行,如果要进行客户端检验则可以利用js或struts中的commons-validator
的检验框架进行检验
3) 利用commons-validator的检验框架的步骤:
A:编写一个ActionForm,此ActionForm类由于参与commons-validator的检验框架所以一定要继承
org.apache.struts.validator.ValidatorForm,注意不是
org.apache.struts.validator.DynaValidatorActionForm;
B:去掉该ValidatorForm中自动生成的validate,和reset方法(一定要去掉否则不会生效)
C:在WebRoot下面找到validator-rules.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>
复制到struts-config.xml到文件的message-resources节点下面
<message-resources parameter="aptech.hotelManager.struts.ApplicationResources" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
D:把validator-rules.xml文件中下面内容复制到ApplicationResources.properties里面
# Struts Validator Error Messages
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.
E: 如果想转换成为中文,可以利用native2ascii -encoding gb2312 源文件进行转换
但是关键字与参数一定不要变动
F: 在Action元素中增加validate="true" 与input="/检验末通过的目的页面"
H: 编写validation.xml文件,该文件一定要放在WebRoot下面
<form-validation>
<formset> //这里面可以放置多个ActionForm
<form name="ruleActionForm"> //ActionForm的名字,此名字一定要与struts-config中定义的文件名一致
<field property="uid" depends="required,maxlength">//要检证的字段名,depends指定要检验的检验器
//检验器可以有多少之间用逗号隔开
<arg0 name="required" key="用户名" resource="false"/>
<arg0 name="maxlength" key="用户名" resource="false"/>
<arg1 name="maxlength" key="5" resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>5</var-value> 说明:
</var>
</field>
</form>
</form-validation>
A: arg0..argn用来给末通过检验时的出错信息提供参数值,该出错信息将使用默认的validator-rules.xml中定义的
错误信息。如果想要自己定义错误信息可以使用msg格式。
比如:<msg name="检验器名" key="出错信息"resource="false"/>
B:name:用来指定该参数将对应的那个检验器,一定要与检验器同名
C:key:用来指定参数的值,resource="false"说明不通过资源文件直接指定值
D:var用来为检验器指定检验的规则,大多数检验器都需要用户自己定义规则
E:其中的var-name一定要与检验器同名,var-value用来指定规则值
F:<arg>参数可以省略name属性此时多个检验器共享arg中提供的参数值 比如:
<field property="uid" depends="required,mask">
<arg0 name="required" key="用户名" resource="false"/>
<arg0 name="mask" key="用户名" resource="false"/>
可以改成:
<field property="uid" depends="required,mask">
<arg0 key="用户名" resource="false"/>表示当required检验失败时,会把"用户名"填充{0}
errors.required={0} is required 而mask检验指失败时,同样会把"用户名"填充{0}
errors.invalid={0} is invalid
G:常见的检验器:
1:required必填。出错提示对应于errors.required={0} is required
不需要用户指定检验规则,一般配置如下
<field property="uid" depends="required">
<arg0 name="required" key="用户名" resource="false"/>
2:mask。正则表达式。出错提示对应于errors.invalid={0} is invalid.
需要用户指定检验规则,一般配置如下
<form name="ruleActionForm">
<field property="uid" depends="required,mask">
<arg0 name="required" key="用户名" resource="false"/>
<arg0 name="mask" key="用户名" resource="false"/>//指定出错信息
<var> //指定规则,注意规则名一定要写mask
<var-name>mask</var-name>
<var-value>^[a-zA-Z0-9]{5,8}$</var-value>
</var>
</field>
</form>
3:email。检查邮箱。出错提示对于 errors.email={0} is an invalid e-mail address
不需要指定检验规则。一般配置如下
<field property="email" depends="required,email">
<arg0 name="required" key="邮箱" resource="false"/>
<arg0 name="email" key="你输入的邮箱" resource="false"/>
</field>
4:intRange。检查一个数在某个范围之内。
出错提示对应于:errors.range={0} is not in the range {1} through {2}
需要用户指定规则。由于规则中涉汲到有多个值,所以需要用${var:变量名}的形式进行分别指定。
一般配置如下:
<field property="age" depends="intRange">
<arg0 name="intRange" key="年龄" resource="false"/>
<arg1 name="intRange" key="${var:max}" resource="false"/>
//${var:max}表示引用规则中的值。也可以直接写成
//<arg1 name="intRange" key="50" resource="false"/>
<arg2 name="intRange" key="${var:min}" resource="false"/>
<var> //规则名一定要与max与min。
<var-name>max</var-name>
<var-value>50</var-value>
</var>
<var>
<var-name>min</var-name>
<var-value>20</var-value>
</var>
</field>
5:validwhen。validwhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断
以确定该域的值是否符合要求.出错提示对应errors.required={0} is required.
需要用户指定规则.一般配置格式:
<field property="surePwd" depends="validwhen">
<msg name="validwhen" key="两次输入的密码必须一致" resource="false"/>
<var>
<var-name>test</var-name>
<var-value>(*this*==pwd)</var-value>
</var>
</field>
说明:
1)在此使用<msg>用来自定义出错信息。
因为默认情况下validwhen对应的出错信息是errors.required={0},不能表达错误提示信息
2)<msg>中的name表示检验器名,key表示自定义的出错信息,resource="false"表示不
从资源文件中加载错信息
3)输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr)
其引用名为test,即形如:
<var>
<var-name>test</var-name>
<var-value>(expression)</var-name> //注意表达式一定要加括号
</var>
即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:
A:表单中其它域属性的名称,例如:
<var>
<var-name>test</var-name>
<var-value>(color=="red")</var-name>
</var>
例子中color为表单中其它某个域的属性名。
B:*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*
C:可以使用一些常规运算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等
6:date。判断是否是合法的日期.出错提示对应于errors.date={0} is not a date。需要自己定义规则.
一般配置格式:
<field property="dtm" depends="date">
<arg0 name="date" key="日期" resource="false"/>
<var>
<var-name>datePatternStrict</var-name> //规则名一定要是datePatternStrict
<var-value>yyyy-MM-dd</var-value>
</var>
</field>
H:如何显示错误信息:
<logic:messagesPresent> //如果存在错误
<html:messages id="error">//依次遍历每个错误
<li><bean:write name="error"/></li>
</html:messages>
</logic:messagesPresent>
H:让struts在客户端进行验证:
A:为jsp中的form元素增加οnsubmit="return validate.XxxForm(this);"其中的XxxForm就是在
struts-config.xml中配置的ActionForm的名字
B:在</html:form>的后面增加<html:javascript formName="xxxForm" />
C:但是validwhen不支持在客户端进行验证
应用举例:
1)让用户填写一个注册页面。
2)用两种方法
A:弹出对话框
B:直接在注册页面的上面来显示末通过的提示