使用commons-validator.jar校验框架时,有如下几个通用配置:
1)增加校验资源。
2)利用ValidatorPlugIn加载校验资源。(struts-config.xml)
3)ActionForm使用ValidatorForm的子类。
一、基本校验
<1>Struts的ActionForm必须是ValidatorForm的子类:
public class LoginForm extends ValidatorForm
<2>编写表单域时必须满足校验规则。校验规则都由规则文件控制,规则文件有以下两个:
validator-rules.xml文件
validator.xml文件
第一个文件是通用文件,而validator.xml文件是属于该项目的校验文件,负责定义每个表单必须满足的规则,以及规则的详细说明。
validator.xml文件
<?xml version="l.O" encoding="iso-8859-l"?>
<!-- 校验规则文件的文件头,包含DTD 等信息-->
<lDOCTYPE 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〉
<!-- 所有需要校验的form 都放在formset 元素里-->
<formset>
<!-- 定义需要校验的表单,此处的name 必须与struts-config.xrnl中定义的AcitonForm的名字一致-->
<form name="loginForm">
<!--每个field 元素定义一个表单域,必须满足怎样的规则此处定义必须满足两个规则:必填,匹配正则表达式-->
<field property="username" depends="required,mask">
<!-- 定义出错字符串的第一个参数的值-->
<arg key="loginForm.username" position="0"/>
<!--定义正则表达式-->
<var>
<var-name>mask</var-name>
<var-value>~[a-zA-Z]+$</var-value>
</var>
</field>
<!-- 定义pass 域,需要满足必填规则-->
<field property="pass" depends="required">
<!--定义出错字符串的第一个参数的值-->
<arg key="loginForm.pass" position="O"/>
</field>
<!-- 定义rpass 域,需要满足必填、满足有效条件这两个规则-->
<field property="rpass" depends="required,validwhen">
<!--定义出错字符串的第一个参数的值-->
<arg key="loginForm.rpass" position="O"/>
<!--定义出错字符串的第二个参数的值-->
<arg key="loginForm.pass" position="l"/>
<!-- 定义不满足有效条件时候额出错提示-->
<msg name="validwhen" key="loginForm.valid"/>
<!-- 定义必须满足的有效条件-->
<var>
<!-- test 是满足有效条件的固定匹配条件,无须修改-->
<var-name>test</var-name>
<!-- 设定有效条件,此项为空,或者此项与pass 域相等-->
<var-value>((*this*==null)or(*this*==pass))</var-value>
</var>
</field>
<!--定义mail域,需要满足必填、合法email地址这两个规则-->
<field property="mail" depends="required,emaiI">
<arg key="loginForm.email" position="O"/>
</field>
</form>
</formset>
</form-validation>
<3>指定如果不满足校验规则,系统将返回到哪个页面,可通过struts-config.xml文件指定即可。在struts-config.xml 文件中配置action时,action有个input属性,该属性用于指定不满足规则时返回的页面。另外,还应为action元素增validate= "true"属性。
<action-mappings>
<!--下面的action 定义增加了input 属性,该属性定义了不能通过输入校验时的返回页面-->
<action path="/login"
type="vaan.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/login.jsp">
<!--定义了一个局部Forward-->
<forward name="success" path="/welcome.html"/>
</action>
<faction-mappings>
<4> 加载校验规则文件。加载的校验规则文件有两个:validator-rules.xml,该文件由Struts提供; validation.xml文件,该文件由程序员书写,定义了表单域必须满足的规则。
<plug-in className="org.apache.struts.validator.ValidatorPlugln">
<set-property property= "pathnames" value=" /WEB-INF /validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="true"/>
</plug-in>
<5>增加校验所需的国际化资源文件。
<6>在JSP页面中输入出错提示。使用html:messages标签来完成在JSP页面中输出出错提示时,可在登陆的login页面增加如下代码:
{ <!--如果消息存在,计算并输出标签体-->
<logic:messagesPresent>
<!--直接输出errors.header的国际化消息-->
<bean:message key="errors.header"/>
<ul>
<!--依次遍历每个错误-->
<html:messages id="error">
<!-- 输出每个出错提示-->
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr/>
</logic:messagesPresent>}
老师的例子:
<bean:message key="uname"/> : <html:text property="uname"/><html:errors property="uname"/><br/>
<!-- html:test 的property必须和后面html:errors的property一致。查看配置文件validation.xml
<field property="uname" depends="required,mask">
//定义出错字符串的第一个参数的值
<arg key="uname" position="0"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]+$</var-value>
</var>
</field>
再查看validation-rules.xml校验规则
<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>
<validator name="mask"//约束规则mask
classname="org.apache.struts.validator.FieldChecks"
method="validateMask"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.invalid"//国际化资源文件/>
-->
用户账号 : 用户账号格式不符合,无效。
上面国际化资源文件position=0对应“用户账号”,errors。invalid对应“格式不符合,无效。”
二、common-validator支持的校验规则
• required: 必填。
• validwhen: 必须满足某个有效条件。
<field property="rpass" depends="required,validwhen">
<arg key="rpass" position="0"/>
<arg key="upass" position="1"/>
<msg key="userForm.valid" name="validwhen"/>
<var>
<var-name>test</var-name>
<var-value>((*this*==null)or(*this*==upass))</var-value>
</var>
</field>
• minlength: 输入必须大于最小长度。
• maxlength: 输入必须小于最大长度。
• mask: 输入匹配正确的表达式。
<field property="uname" depends="required,mask">
<arg key="uname" position="0"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]+$</var-value>
</var>
</field>
• byte: 输入只能是一个byte 类型变量。
• short: 输入只能是一个short 类型变量。
• integer: 输入只能是一个integer 变量。
• long: 输入只能是一个long 变量。
• float: 输入只能是一个float 变量。
• double: 输入只能是一个double 变量。
• date: 输入必须是一个日期。
• intRange: 输入的数字必须在整数范围内。
• floatRange: 输入的数字必须在单精度浮点数范围内。
• doubleRange: 输入的数字必须在双精度浮点数范围内。
• email: 输入必须是有效的E-mail地址。
<field property="email" depends="required,email">
<arg key="email" position="0"/>
</field>
• url: 输入必须是有效的url地址。
国际化资源文件:
#违反必填规则时候的出错信息
errors.required={O} 必须填写。
#违反最小长度规则时候的出错信息
errors.minlength={O} 的长度不能少于{l} 个字符。
#违反最大长度规则时候的出错信息
errors.maxlength={ 们的长度不能大于{l}个字符。
#违反validwhen 规则时候的出错信息
errors.invalid={O} 无效。
#违反byte 规则时候的出错信息
errors.byte={O} 必须是个byte 类型的值。
#违反short 规则时候的出错信息
errors.short={O} 必须是个short 类型的值。
#违反integer 规则时候的出错信息
errors.integer={O} 必须是个integer 类型的值。
#违反long 规则时候的出错信息
errors.long={O} 必须是个long 类型的值。
#违反float 规则时候的出错信息
errors.float={O} 必须是个float 类型的值。
#违反double 规则时候的出错信息
errors.double={O} 必须是个double 类型的值。
#违反date 规则时候的出错信息
errors.date={O} 必须是有效的日期。
#违反所有的range 规则时候的出错信息
errors.range={O} 必须在{l}和{2} 之间。
#违反email 规则时候的出错信息
errors.email={O} 不是一个有效的E-mail 地址。
三、使用DynaValidatorForm的校验
四、弹出客户端JavaScript提示
如果需要弹出客户端JavaScript校验非常简单,无须修改其他配置文件,只需修改登陆使用的JSP页面的两个地方:
1、为form元素增加οnsubmit="return validatorXxxForm(this);"属性,其中的XxxForm就是需要验证的form名,与struts-config.xml中配置的form-bean 的name 属性一致,也与validation.xml文件中需要校验的form 的name 属性一致。
2、增加<html:javascript formName="xxxForm"/>,其中xxxForm是需要验证的form名:
<!--为form 元素增加onsubmit 属性-->
<html:form action="login.do" οnsubmit="return validateLoginForm(this);">
<table border="O" width="100%">
<tr>
<!-- 输出用户的国际化提示 -->
<th align="left"><bean:message key="username"/></th>
<td align="left"><html:text property="username" size="15"/></td>
</tr>
<tr>
<!--输出密码的国际化提示-->
<th align="left"><bean:message key="pass"/></th>
<td align="left"><html:text property="pass" size="15"/></td>
</tr>
<tr>
<!--输出重复密码的国际化提示-->
<th align="left"><bean:messagekey="rpass"/></th>
<td align="left"><html:text property="rpass" size="15"/></td>
</tr>
<tr>
<!--输出电子邮件的国际化提示-->
<th align="left"> <bean:message key="mail"/></th>
<td align="left"><html:text property="mail" size="15"/></td>
</tr>
<tr>
<td><input type="submit" value='<bean:message key="button.submit"/>'/>
<input type="reset" value='<bean:message key="button.reset"/>'/>
</td>
</tr>
</table>
</html:form>
<!-- 增加html: javascript标签-->
<html:javascript formName="loginForm"/>