Struts裏的Validator驗證框架

Validator框架概述
安裝和配置Validator框架
validator-rules.xml文件
validation.xml文件
Validator插件
Validator框架和ActionForm
Validator框架示例
在Validator框架中使用JavaScript


Validator框架概述
Struts框架能夠在ActionForm的validate()方法中對用戶輸入的表單數據進行驗證。這種驗證方式有兩個侷限:
必須通過程序代碼來實現驗證邏輯,如果驗證邏輯發生變化,必須重新編寫和編譯程序代碼。
當系統中有多個ActionForm,並且它們包含一些相同的驗證邏輯時,開發人員必須對每個ActionForm進行重複編程,完成相同的驗證邏輯,這會降低代碼的可重用性。
Validator框架能被集成到Struts框架中,負責數據驗證。並且能克服在ActionForm中以編程方式進行數據驗證的侷限,它允許Struts應用靈活的配置驗證規則,無需編程。
如今,Validator框架在Struts應用中得到了廣泛的運用,Apache組織已經把它添加到Jakarta工程中,在Struts軟件中攜帶了Validator框架。

安裝和配置Validator框架
Validator框架主要依賴於兩個JAR文件:
jakarta-oro.jar
提供了一組處理文本的類,具有文本替換、過濾和分割等功能。
commons-validator.jar
提供了一個簡單、可擴展的驗證框架,包含了通用的驗證方法和驗證規則。
如果在Struts應用中使用了Validator框架,那麼把這兩個JAR文件添加到應用的WEB-INF/lib目錄中。
Validator框架採用兩個基於XML的配置文件來配置驗證規則。這兩個文件爲validator-rules.xml和validation.xml。在Struts應用,它們均存放在WEB-INF目錄下。

validator-rules.xml文件
validator-rules.xml文件包含了一組通用的驗證規則,對所有的Struts應用都適用。Struts軟件中攜帶了這個文件。一般情況下,沒有必要修改該文件,除非需要修改或擴展默認的規則。
Validator框架提供了14種默認的驗證規則:
byte、short、integer、long、float、double:檢驗輸入的數據是否能被轉換成對應的基本數據類型
creditCard:檢驗輸入的數據是否是一個合法的信用卡號碼
date:檢驗輸入的數據是否是一個合法日期
email:檢驗輸入的數據是否是一個合法Email地址
mask:檢驗輸入的數據是否能成功匹配一個正則表達式
maxLength:檢驗輸入的數據的長度是否小於等於給定的最大長度
minLength:檢驗輸入的數據的長度是否大於等於給定的最小長度
range:檢驗輸入的數據的範圍是否在最大值和最小值之間
required:檢驗輸入數據是否爲空,或不包含空格值的長度是否大於零

validation.xml文件
Validator框架的第二個配置文件爲validation.xml文件。這個文件是針對於某個具體Struts應用的,需要開發人員來創建,它可以爲應用中的ActionForm配置所需的驗證規則,取代在ActionForm類中以編程的方式來實現驗證邏輯。
                元  素                                                        說  明
<form-validation>                                       根元素,它包含兩個子元素<global>與<formset>
<global>                                                     包含多個<constant>子元素
<constant>                                                 用來定義常量表達式,其中<constant-name>元素指定常量名,                                                                   <constant-value>元素指定對應的表達式
<formset>                                                   包含兩個子元素<constant>與<form>
<form name="">                                         爲表單配置驗證規則,可以包含多個<field>子元素
<field property="" depends="">                 配置表單中字段的驗證規則
<arg name="" key="" resource="">           <field>元素的子元素,用於替換複合消息中的參數
<msg name="" key="" resource="">          <field>元素的子元素,指定驗證規則對應的消息文本
<var><var-name><var-value></var>         <field>元素的子元素,用來向驗證規則傳遞參數

Validator插件
爲了在Struts框架中使用Validator,可以採用插件機制把Validator加入到框架中。這需要在Struts配置文件中配置ValidatorPlugIn插件。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property
    property="pathnames"
    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

Validator框架和ActionForm
Validator框架不能用於驗證標準的ActionForm類,如果要使用Validator框架,應該採用ActionForm類的子類。
ValidatorForm
DynaValidatorForm
ValidatorActionForm
DynaValidatorActionForm

舉例:
ActionForm
package form;
import org.apache.struts.validator.ValidatorForm;

public class UserForm extends ValidatorForm {
    private String id;
    private String name;
    private String pwd;
    private String birthday;
    private Integer age;
    private String email;   
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    ……
}

Action
package action;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import form.UserForm;

public class UserAction extends Action {
    public ActionForward execute(......) {
        UserForm userForm = (UserForm) form;
        return mapping.findForward("output");
    }
}

JSP
user.jsp
<html:form action="/user">
  id : <html:text property="id"/><html:errors property="id"/><br/>
  name : <html:text property="name"/><html:errors property="name"/><br/>
  pwd : <html:password property="pwd"/><html:errors property="pwd"/><br/>
  birthday : <html:text property="birthday"/>
  <html:errors property="birthday"/><br/>
  age : <html:text property="age"/><html:errors property="age"/><br/>
  email : <html:text property="email"/><html:errors property="email"/><br/>
  <html:submit/><html:reset/>
</html:form>
output.jsp
id : <bean:write name="userForm" property="id"/><br/>
name : <bean:write name="userForm" property="name"/><br/>
pwd : <bean:write name="userForm" property="pwd"/><br/>
birthday : <bean:write name="userForm" property="birthday"/><br/>
age : <bean:write name="userForm" property="age"/><br/>
email : <bean:write name="userForm" property="email"/><br/>

struts-config.xml
<struts-config>
  <form-beans >
    <form-bean name="userForm" type="form.UserForm" />
  </form-beans>
  <action-mappings >
    <action attribute="userForm" input="/user.jsp" name="userForm"
    path="/user" scope="request" type="action.UserAction">
      <forward name="output" path="/output.jsp" />
    </action>
  </action-mappings>
  <message-resources parameter="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>
</struts-config>

ApplicationResources.properties
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.

validator-rules.xml
<form-validation>
  <global>
    <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"/>
    ......
  </global>
</form-validation>

validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
  <formset>
    <form name="userForm">
      <field property="id" depends="required,mask"/>  
      <field property="name" depends="required"/>
      <field property="pwd" depends="required,minlength,maxlength"/>
      <field property="birthday" depends="required,date"/>
      <field property="age" depends="required,intRange"/>
      <field property="email" depends="required,email"/>
    </form>
  </formset>
</form-validation>

<field property="id" depends="required,mask"/>

<!-- 配置表單中字段的驗證規則 -->
<field property="id" depends="required,mask">
  <!-- 用於替換複合消息中的參數 -->
  <arg key="id" resource="false" />
  <!-- 指定驗證規則對應的消息文本 -->
  <msg name="mask" key="id is error [B001]" resource="false" />
  <!-- 用來向驗證規則傳遞參數 -->
  <var>
    <var-name>mask</var-name>
    <var-value>^[B]{1}[0-9]{3}$</var-value>
  </var>
</field>

<field property="name" depends="required"/>

<field property="name" depends="required">
  <arg key="name" resource="false" />
</field>

<field property="pwd" depends="required,minlength,maxlength"/>

<field property="pwd" depends="required,minlength,maxlength">
  <arg0 key="pwd" resource="false" />
  <arg1 name="minlength" key="${var:minlength}" resource="false" />
  <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
  <var>
    <var-name>minlength</var-name>
    <var-value>4</var-value>
  </var>
  <var>
    <var-name>maxlength</var-name>
    <var-value>10</var-value>
  </var>
</field>

<field property="birthday" depends="required,date"/>

<field property="birthday" depends="required,date">
  <arg key="birthday" resource="false" />
</field>

<field property="age" depends="required,intRange"/>

<field property="age" depends="required,intRange">
  <arg key="age" resource="false" />
  <arg name="intRange" key="age" resource="false" />
  <arg1 name="intRange" key="${var:min}" resource="false" />
  <arg2 name="intRange" key="${var:max}" resource="false" />
  <var>
    <var-name>min</var-name>
    <var-value>1</var-value>
  </var>
  <var>
    <var-name>max</var-name>
    <var-value>100</var-value>
  </var>
</field>

<field property="email" depends="required,email"/>

<field property="email" depends="required,email">
  <arg key="email" resource="false" />
</field>

在Validator框架中使用JavaScript
在默認情況下,Validaor框架在Web服務器端執行表單驗證,事實上,Validator框架也可以進行瀏覽器客戶端驗證。
<html:javascript formName="userForm"/>
<html:form action="/user" onsubmit="return validateUserForm(this);">

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章