Spring驗證規則使用方法(整理與修改)

spring的validate驗證需要兩個bean(ValidatorFactory、BeanValidator)及兩xml文件(validator-rules.xml、validation.xml)的支持,ValidatorFactory用於製造BeanValidator,後者則是在程序中執行校驗的控制bean。Validatorrules.xml中定義了各種驗證的規則,如字段不爲空,字段輸入值必須爲整數等等。Validation.xml中則定義了那些bean及bean中的哪些屬性字段需要驗證,使用哪些驗證規則。validate分爲兩級驗證,客戶端驗證(javascript)和服務器端驗證。以下是使用validate的步驟:
1. 在配置文件中聲明ValidatorFactory和BeanValidator:
<bean id="validatorFactory" class="org.springmodules.commons.validator.DefaultValidatorFactory">①<property  name="validationConfigLocations"> ②<list>
 <value>/WEB-INF/validator-rules.xml</value>
 <value>/WEB-INF/validation.xml</value></list></property>
 </bean><bean  id="beanValidator" class="org.springmodules.commons.validator.DefaultBeanValidator">③
 <property  name="validatorFactory">
 <ref  bean="validatorFactory"/> ④</property>
</bean>
① 聲明validatoFactory 這裏我們使用spring的DefaultValidatorFactory
② 定義其validationConfigLocations屬性,將validator-rules.xml和validation.xml傳入
③ 聲明beanValidator 這裏我們使用spring的DefaultBeanValidator
④ 在其屬性中指明要使用的validatorFactory 。這裏我們使用剛剛定義的validatorFactory

2. 在需要進行驗證的controller(即要使用form表單或者command的controller)中聲明validate。
<bean id="xxxxController" ……>
<property name="commandName" value="userCommand"/> ①
<property name="commandClass" value="com.resoft.User"/> ②
<property name="validator" ref="beanValidator"/> ③
……
</bean>
① commandName 用於指明需要驗證的command的名字,這個名字必須和validation.xml中<form name=" xxxxx"> 所寫的名字保持一致。
② commandClass用於指定這個command的類型。其必須與你jsp提交的form最後形成的command類型相一致。
③ 聲明該controller使用validator,這裏將我們剛剛定義的beanValidator傳入進去。

3. 在validation.xml文件中,定義你要校驗的formbean(或者說是command),定義這個bean中有哪幾個field需要驗證,使用何種規則驗證。(注意:這裏定義的form name必須和前面controller中定義的commandName保持一致)以下是幾種常用的驗證示例:
<form-validation>
<formset>
<form name="userCommand"> ① <field property="userId"depends="required"> ② <arg0 key="用戶代碼"/> ③ </field>
①這裏是定義要驗證的bean的名字,要求去上面定義的commandName相同
②這裏定義要驗證的bean屬性爲userId,使用規則爲required(不爲空)
③這裏定義的是顯示信息,arg0表示位置0的顯示信息,顯示key所標明的信息(如果你還有多個信息就用arg1,arg2等)出錯信息將會顯示爲: 用戶代碼不能爲空
<field property="age" depends="required,integer,mask"> ① <arg0 key="年齡" /> <msg name="mask" key="errors.negative"/> ② <var>  <var-name>mask</var-name> <var-value>^[1-9]</var-value>③ </var></field>
①  mask標記驗證,使用正則表達式來約束表單輸入值。(如:只能輸入數字,字母或指定的字符)
② msg標籤用來定義驗證規則和出錯信息的關聯,這裏表示當出現mask校驗失敗時,顯示errors.negative指明的信息。
③ 整個<var>標籤就是用來定義具體的規則的,如<var-name>mask</var-name>指明是用於mask的規則,<var-value>^[1-9]</var-value>表示只允許1-9這幾個數字開頭。所以上面驗證信息是年齡字段不可以爲空,必須爲整數,而且必須爲1-9開頭 也就杜絕了負數和零的情況。
<field property="birthday" depends="required,date"> ①
 <arg0 key="生日"/> <var>
  <var-name>datePatternStrict</var-name> ②
  <var-value>yyyy-MM-dd</var-value> ③
  </var>
</field></formset>
① 使用“date”加入對日期的格式的校驗
② 開始定義日期格式,var-name必須寫爲datePatternStrict
③ 定義你希望的日期格式如:yyyy-mm-ddyy/mm/dd等等都可以。
<field property="startDate" depends="required,date">
<arg0 key="開始日期"/>
<var>
 <var-name>datePatternStrict</var-name>
 <var-value>yyyy-MM-dd</var-value>
 </var>
</field>
<field property="endDate"depends="required,date,compareTwoField"> ①
<arg0 key="結束日期" />
<arg1 key="開始日期" /> ②
<var>
 <var-name>datePatternStrict</var-name>
 <var-value>yyyy-MM-dd</var-value>
 </var>
 <var>
<var-name>secondField</var-name> ③
<var-value>startDate</var-value>
</var>
</field>
①  這裏演示的是兩個日期的驗證,要達到開始日期不能晚於結束日期,加入ompareTwoField驗證規則
② 定義第2個顯示參數agr1“開始日期”
③ 加入一個var其var-name爲secondField(這個是在程序中寫死的,必須寫爲secondField)
④ var-value定義爲開始日期的屬性名,如在本例中爲startDate
注:compareTwoField是我們自己編寫的一個校驗規則,用於比較兩個字段值大小。

4. 在jsp頁面中定義錯誤信息顯示語句:

<spring:bind path="tableCrashDO.*">  ①
<c:if test="${not empty status.errorMessages}">
<div class="error">
<c:forEach var="error" items="${status.errorMessages}">
 <c:out value="${error}" escapeXml="false"/><br/>
</c:forEach>
</div>
</c:if>
</spring:bind>
① 這裏的path必須要與傳入該jsp的bean的名字一樣。如傳入該jsp的數據bean叫tableCrashDO,path就應該寫爲tableCrashDO.*。

5.使客戶端產生javascript代碼:
<v:javascript formName="tableCrashDO"   ①
staticJavascript="false"xhtml="true"cdata="false"/>
<script type="text/javascript"src="<c:urlvalue="scripts/validator.jsp"/>"></script>
①v:javascript標籤是spring的標籤,定義在spring-commons-validator.tld。其中formName必須與validation.xml中form的name保持一致。

(特別注意: controller中的commandName; validation.xml中的form name; jsp中v:javascript標籤的formName三者必須保持一致。)

以上以即爲所用到的validation.xml的應用方面,我們還忽略了一個重要部分,即validation-rule.xml,該文件必須包含Spring框架模型中的基本元素。從名字即可知道這個文件的作用,即定義驗證規則,抽取文件中驗證規則的一個如下:
<validator name="required"
       classname="org.springmodules.validation.commons.FieldChecks"
       method="validateRequired"
       methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.springframework.validation.Errors"
       msg="errors.required">

         <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();
                for (x in oRequired) {
                    var field = form[oRequired[x][0]];
                   
                    if (field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password') {
                       
                        var value = '';
                        // get field's value
                        if (field.type == "select-one") {
                            var si = field.selectedIndex;
                            if (si >= 0) {
                                value = field.options[si].value;
                            }
                        } else {
                            value = field.value;
                        }
                       
                        if (trim(value).length == 0) {
                       
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oRequired[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }
           
            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
           
            ]]>
         </javascript>

      </validator>

完畢

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