commons-validator.jar校验

韩智敏
2023-12-01

 使用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"/>'/>
               &nbsp;
               <input type="reset" value='<bean:message key="button.reset"/>'/>
           </td>
           </tr>
         </table>
       </html:form>
      <!-- 增加html: javascript标签-->
      <html:javascript formName="loginForm"/>

 

 类似资料: