1. 程式人生 > >validator-rules.xml詳解

validator-rules.xml詳解

今天學習了struts中的驗證框架驗證,Validator框架採用兩基於xml的配置檔案來配置驗證規則,這
兩個檔案為validator-rules.xml和validator.xml,在struts應用中,這兩個檔案必須存放在WEB-INF
目錄下。下面是對validator-rules.xml的詳細介紹:
validation.xml檔案的文件結構是由validator_1_1_3.dtd檔案定義,其檔案頭部內容如下:
<?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">
1.頂層元素
<form-validation>,它包含<formset>和<global>子元素。一般只需要定義<formset>元素,<formset>元素定義格式如下:
<formset>      
<constant></constant>
        <form></form>
</formset>
其中<constant />為可選子元素,而<form />子元素至少需要出現一次。<form />子元素的定義格式如下:

<form name="">

      <field property=""></field>

      ..............
 
      <field property=" "    depends=" "    page=" "    indexedListProperty=" "></field>

</form>

其中屬性描述如下:

l-- name:指定了表單的名字與配置檔案中的form-bean的name相同;

l --field:對應表單中驗證的欄位;

l --property:對應ActionForm的屬性;

l-- depends:指定驗證規則,例如:required、maxlength等;

l-- page:ActionForm若是跨頁表單,則與表單中的page屬性對應。

2. <field>子元素配置舉例

2.1 必填(或非空)驗證

非空驗證的depends屬性值為required,配置舉例如下:

<form name="UserForm">

<field property="loginName" depends="required">

<arg0 key="UserForm.loginName" />

</field>

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

<arg0 key="UserForm.name" />

</field>

<field property="password" depends="required">

<arg0 key="UserForm.password" />

</field>

</form>

其中<arg0 key="UserForm.password" />中的key跟資原始檔中的鍵對應。

注意:為了使預設的驗證產生正確的資訊,開發人員還需要在資原始檔中新增errors.required等預設的錯誤資訊,具體操作時,開發人員可在簡體中文的資原始檔:ApplicationResources_zh_CN.properties.bak中新增如下資訊:

errors.required = {0}不能為空

errors.maxlength = {0}長度不能大於{1}個字元

errors. minlength = {0}長度不能小於{1}個字元

errors.short = {0}必須是一個整數

errors.integer = {0}必須是一個整數

errors.long={0}必須是一個整數

errors.float={0}必須是一個浮點數

errors.double ={0}必須是一個雙精度型

errors.date={0}必須是一個日期

errors.range = {0}必須是 {1} 到 {2}之間的整數

errors.creditcard={0}必須是一個有效的信用卡號碼

errors.email = {0}是無效e-mail地址

在英文資原始檔ApplicaitonResources.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.

2.2 最大長度和最小長度驗證

可在<field>元素的depends屬性中新增maxlength和minlength來限制對於那個欄位的最大長度和最小長度,使用舉例如下:

<field property="password" depends = "required, maxlength, minlength">

<arg0 key = "UserForm.password"/>

<var>

<var-name>maxlength</var-name>

<var-value>12</var-value>

</var>

<var>

<var-name>minlength</var-name>

<var-value>6</var-value>

</var>

</field>

2.3 Email驗證

在Struts中還可以新增email驗證,此時depends為email,使用舉例如下:

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

<arg0 key="UserForm.email" />

</field>

2.4 日期驗證

在Struts中還可以新增日期驗證,此時depends為date,使用舉例如下:

<field property="begintime" depends="date">

<arg0 key="HistoryForm.begintime" />

</field>

2.5 整數範圍驗證

在Struts中還提供了驗證整數是否在某個範圍之間,例如下述的例子驗證整數是否在1到9999之間,配置如下:

<field property="score" depends="intRange">

<arg0 key="TestForm.score" />

<arg1 name="intRange" key="${var:min}" resource="false" />

<var>

<var-name>min</var-name>

<var-value>1</var-value>

</var>

<arg2 name="intRange" key="${var:max}" resource="false" />

<var>

<var-name>max</var-name>

<var-value>99999</var-value>

</var>

</field>

2.6 自定義驗證

在Struts中的驗證機制提供了擴充套件,開發人員可以新增自定義的驗證規則,例如可新增檔案型別的驗證。此時需要編寫的Java類、在validator-rules.xml新增該驗證規則以及新增驗證的js。

自定義驗證的Java類CustomValidator的程式碼如下所示:
package com.amigo.struts.validation;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;
/**
 * Struts自定義驗證類.
 */
public class CustomValidator {
        
         /**
          * 判斷檔案型別
          */
         public static boolean validateFileType(Object bean, ValidatorAction va,
                            Field field, ActionMessages errors, Validator validator,
                            HttpServletRequest request) {
                   String value = ValidatorUtils.getValueAsString(bean, field
                                     .getProperty());
                   String inputType = value.substring(value.lastIndexOf('.'));
                   String type[] = field.getVarValue("fileTypeProperty").split(";");
                   if (!GenericValidator.isBlankOrNull(value)) {
                            try {
                                     boolean judge = false;
                                     for (int i = 0; i < type.length; i++) {
                                               Pattern p = Pattern.compile(type[i],
                                                                 Pattern.CASE_INSENSITIVE);
                                               Matcher m = p.matcher(inputType);
                                               judge = m.matches();
                                               if (judge) {
                                                        break;
                                               }
                                     }
                                    
                                     if (!judge) {
                                               errors.add(field.getKey(), Resources.getActionMessage(
                                                                 validator, request, va, field));
                                               return false;
                                     }
                            } catch (Exception e) {
                                     errors.add(field.getKey(), Resources.getActionMessage(
                                                        validator, request, va, field));
                                     return false;
                            }
                   }
                   return true;
         }
}
       接著還需要在validator-rules.xml這個驗證規則檔案中新增如下內容:
<!-- 判斷檔案型別-->
<validator name="fileType" classname="com.cotel.comm.EarlyValidator" method="validateFileType"
                            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.fileType">
                            <javascript>
                                     <![CDATA[
 function validateFileType(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");
                  
       oFileType = eval('new ' + formName.value + '_fileType()');
       
      
     
        for (x in oFileType) {
            var field = form[oFileType[x][0]];
                           
           
            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'file' ||
                field.type == 'textarea') &&
                field.disabled == false) {
                           
             var iMax =oFileType[x][2]("fileTypeProperty").split(";");
             var index = field.value.lastIndexOf(".");
          var length = field.value.length;
                  var fileType= field.value.substring(index, length);
                  var judege=false;
                
                 if(length>0 && fileType!=""){
         for (var j = 0; j < iMax.length; j++) {
            if (iMax[j].toLowerCase() == fileType.toLowerCase()) {
                judege = true;
                break;
            }
                  }
                
            if (!judege) {
            if (i == 0) {
                        focusField = field;
                    }
          
                    fields[i++] = oFileType[x][1];
                    isValid = false;
                }
                }
            }
        }
        if (fields.length > 0) {
           focusField.focus();
           alert(fields.join('"n'));
        }
        return isValid;
    }
    ]]>
                            </javascript>
                   </validator>
              利用上面這個自定義的驗證可以驗證檔案的型別,在下面的例子中驗證檔案的型別是否為jpg的,舉例如下:
<field property="picPath" depends="required,fileType">
         <arg0 key="TestForm.picPath" />
         <var>
                   <var-name>fileTypeProperty</var-name>
                   <var-value>.jpg</var-value>
         </var>
</field>
3.  完整配置例項
       本小節舉一個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="UserinfoForm">
                            <field property="email" depends="email">
                                     <arg0 key="UserinfoForm.email" />
                            </field>
                            <field property="mobile" depends="required">
                                     <arg0 key="UserinfoForm.mobile" />
                            </field>
                            <field property="description" depends="maxlength">
                                     <arg0 key="UserinfoForm.description" />
                                     <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
                                     <var>
                                               <var-name>maxlength</var-name>
                                               <var-value>200</var-value>
                                     </var>
                            </field>
                   </form>
                   <form name="PasswordForm">
                            <field property="newPass" depends="required">
                                     <arg0 key="PasswordForm.newPass" />
                            </field>
                            <field property="oldPass" depends="required">
                                     <arg0 key="PasswordForm.oldPass" />
                            </field>
                            <field property="conPass" depends="required">
                                     <arg0 key="PasswordForm.conPass" />
                            </field>
                   </form>
         </formset>
</form-validation>
 
===========================分割線=======================
關於validation.xml
在validator.xml中使用了validation-rules.xml的驗證規則
注意一定要加其已經定義好的出錯訊息考到你的資源包裡去,否則出錯的時候,顯示錯誤對話方塊
裡面卻什麼錯誤訊息都沒有,不允許發生這樣的錯誤
---------------------------------------------------------------------------------
<arg>:一共可定義4個(arg0..arg3),作用是向資原始檔提供引數的值。屬性同<msg>
<arg1 key="${var:min}" resource="false"/>
        <var>
          <var-name>min</var-name>
          <var-value>10</var-value>
        </var>
既是代替資源包中{1}的引數值
又是在驗證規則中傳進了引數
記住將resource="false"(當設為false時,key值可自定義)
---------------------------------------------------------------------------------
11月15日
Validator驗證框架
validator.xml
在validator.xml 檔案中定義formset 元素時,需要使用校驗器和訊息關鍵字,如清單12.3formset 元素

<formset>
     <form name="logonForm">
        <field   property="username"    depends="required,mask">
            <msg name="mask" key="logon.username.maskmsg"/>
            <arg0 key="logon.userName.displayName"/>
                 <var>
                       <var-name>mask</var-name>
                       <var-value>^[a-zA-Z0-9]*$</var-value>
                 </var>
       </field>

      <field property="password"   depends="required,minlength">
            <arg0 key="logon.password.displayName"/>
                <var>
                     <var-name>minlength</var-name>
                     <var-value>5</var-value>
                </var>
     </field>
    </form>
</formset>
 

○1 formset 是一個或者多個form的包裝器.
○2 每個form 元素都要給定其自身的名稱。這應該對應於Struts 配置中的form bean 名稱或
者 action 的路徑。
○3 每個form 元素有一些field 元素組成
○4 field 元素通過depends 屬性指出要使用哪個校驗器。
○5 可選的msg 元素允許你指定針對一個校驗器的定製訊息和用於替換引數的訊息關鍵字
○6 arg0 元素指定了那些需要它們的訊息所用的第一個替換引數
○7 var 元素用於傳遞變數屬性到校驗器中。
○8 這裡傳遞了一個正則表示式到mask 校驗器。表示式意思是使用者名稱稱只可以包含字母和
數字。.
○9 這裡我們設定password 是必須的,並且至少有5個字元的長度。password 長度是一個業
務需求,幫助使使用者賬戶更加安全。
password 校驗訊息使用了預設 minlength or required 訊息,該訊息定義於
validation-rules.xml (errors.minlength and errors.required)。

<form>:指定要校驗的ActionForm
屬性 描述 name 指定要校驗的ActionForm的名字  <field>:指定要校驗ActionForm的哪一個屬性
屬性 描述 property 指定要校驗的ActionForm中的屬性名 depends 所用的校驗規則,在validation-rules中定義 page ?當此屬性的值小於或等於與此form相關的javabean的page值時,此field才會被處理 indexedListProperty ?The method name that will return an array or a Collection used to retrieve the list and then loop through the list, performing the validations for this field.  
 
<msg>:校驗失敗時加到Action Errors中的資訊,用來替代validator-rules中預設的錯誤資訊
屬性 描述 name 使用校驗的規則名 key 資原始檔中的key或自定義的值 Resource 當設為false時,key值可自定義
 
<arg>:一共可定義4個(arg0..arg3),作用是向資原始檔提供引數的值。屬性同<msg>
 

---------<msg>的重要作用---------------------------------------------------------
在某些情況下,您可能想提供一個更具體的錯誤訊息而不是在資源束檔案中定義的預設錯誤訊息。
例如,如果您有一個 Mask 驗證器,預設錯誤訊息是,該值是無效的,而沒有關於無效性的詳細情況。
您可以用另一個訊息覆蓋 Mask 驗證器的錯誤訊息,
方式是將如下一行程式碼新增到 validator.xml 中:
  <msg name="mask" key="some.other.error.msg"/>。
將如下一行程式碼新增到檔案 ApplicationResources.properties 中並儲存:
some.other.error.msg = {0} is not a 5-digit number
如下編輯 validation.xml 並儲存:
<form-validation>
   <formset>
    <form name="submitForm">
     <field property="name" depends="required,mask">
     <msg name="mask" key="some.other.error.msg"/> !!!!!在這裡加上這麼一句,替換mask的訊息,
     !!!這裡可以用多個<msg>來替換所有的原始訊息,比如再加一個<msg>替換required
     <msg>的name屬性必需來自上面的depends,因為它要替換其中驗證規則的錯誤訊息
     <arg0 key="submitForm.name"/>
         <var>
           <var-name>mask</var-name>
           <var-value>^//d{5}//d*$</var-value>
         </var>
     </field>
    </form>
   </formset>
</form-validation>
------一些驗證規則的用法------------------------------------------------------------
你depends引用任何一個validator-rules.xml中的規則,它都對應一個預設的錯誤資訊
如:xxx{0}xxxxx
如果你引用了很多個規則,則有以下錯誤資訊
   xxx{0}xxx
   xxx{0}xxx{1}xxx{2}xxx...
則你需要<arg0 <arg1 <arg2
因為你驗證的是一個頁面的元件,則<arg0 一定是此元件的名字
為了實現國際化,此元件的名字可能在資源包中,如xx.xx
則從xx.xx中獲得鍵的值,然後又賦給資源包中的{0}引數(就是<arg0>)
記住不論引用幾種驗證規則,{0}可以重複,它代表元件名,它以上的不能重複
   xxx{0}xxx       
   xxx{0}xxx{1}xxx            第二個驗證規則
   xxx{0}xxx{1}xxx{2}xxx...   第三個驗證規則
這樣的情況應該是不存在的
因為如果寫了第二個驗證規則的<arg1
        <arg1 key="${var:minlength}" resource="false"/>
        <var>
          <var-name>minlength</var-name>
          <var-value>8</var-value>
        </var>
又寫第三個驗證規則的<arg1
同時出現兩個<arg1
這怎麼說也非常不適合邏輯

檢查是不是字母的正則表示式:^[a-zA-Z]*$
驗證minlength(輸入的最小長度)
      <field property="userName" depends="required,minlength">
        <arg0 key="label.username"/>
        <arg1 key="${var:minlength}" resource="false"/>
        <var>
          <var-name>minlength</var-name>
          <var-value>8</var-value>
        </var>
      </field>
驗證intRange(取值範圍)
      <field property="age" depends="required,intRange">
        <arg0 key="label.age"/>
        <arg1 key="${var:min}" resource="false"/>
        <arg2 key="${var:max}" resource="false"/>
        <var>
          <var-name>min</var-name>
          <var-value>10</var-value>
        </var>
        <var>
          <var-name>max</var-name>
          <var-value>70</var-value>
        </var>
      </field>
驗證信用卡號
      <field property="idCard" depends="required,creditCard">
        <arg0 key="label.idcard"/>
      </field>
驗證日期格式(比如出生日期)
      <field property="birthday" depends="required,date">
        <arg0 key="label.birthday"/>
        <var>
          <var-name>datePatternStrict</var-name>
          <var-value>yyyy-MM-dd</var-value>
        </var>
      </field>
驗證email和url
    depends="email">
  <arg0 key="prompt.email" />
</field>
<field property="url"
    depends="url">
  <arg0 key="prompt.url" />
</field>
使用mask驗證(可以使用各種正則表示式)
    depends="required,mask">
  <arg0 key="prompt.phone" />
  <var>
    <var-name>mask</var-name>
    <var-value>^/(?(/d{3})/)?[-| ]?(/d{3})[-| ]?(/d{4})$</var-value>
  </var>
</field>
但是,可以容易地在多個地方使用同一個掩碼。每次使用時不必重新定義,只要把掩碼定義移動到 global constant 即可。
請把下面的內容新增到 validation.xml 檔案中的 global 元素內(靠近檔案頂部):
<global>
  <constant>
    <constant-name>phone</constant-name>
    <constant-value>^/(?(/d{3})/)?[-| ]?(/d{3})[-| ]?(/d{4})$</constant-value>
  </constant>
</global>
然後在下面使用${phone} <field property="phone"
    depends="required,mask">
  <arg0 key="prompt.phone" />
  <var>
     <var-name>mask</var-name>
     <var-value>${phone}</var-value>
  </var>
</field>
 
-------------------------------------------------
關於 validator-rules.xml
分析一下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.ActionErrors,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.required">
         <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusF......
屬性
 描述
 
name
 指定一個規則名,用來被其它規則引用
 
ClassName
 包含校驗規則的類
 
method
 此校驗規則在類中實際對應的方法
 
methodParams
 Method方法的引數
 
depends
 引用其它的規則(在當前規則之前被呼叫)
 
msg
 資原始檔中的關鍵字,當校驗不通過時,此關鍵字中的資訊將加入到errors集合中。
 
jsFunctionName
 指定一個JavaScript函式名
 
----------------------------------------------------------
validator驗證
1.1 組成與配置
配置檔案: validator-rules.xml、validation.xml
由於validation.xml是要自定義的,所以裡面的元素希望都能夠記下來
並且能夠將validation.xml手寫出來
當然validator-rules.xml不要求你會手寫,但是請記住裡面有哪些元素與屬性
驗證需要用到的庫
commons-beanutils.jar: Commons BeanUtils
commons-collections.jar: Commons Collections
commons-digester.jar: Commons Digester
commons-logging.jar: Commons Logging
commons-validator.jar: Commons Validator
jakarta-oro.jar: Jakarta ORO
 
validator驗證分伺服器端驗證和客戶端驗證
用了哪一種驗證很好區別
如果是在註冊頁面上出文字(使用了<html:errors/>),則是伺服器端驗證
如果是彈出了一個對話方塊,則是使用了客戶端驗證
---------------------------------------------------------------------------------
伺服器端的驗證
為了使用伺服器端驗證,Action Form 實現類應該擴充套件 ValidatorForm 而不是 ActionForm。當提交表單時,會執行 ValidatorForm 中的 validate() 方法,它將根據 validation-rules.xml 和 validation.xml 檔案進行驗證。

1.擴充套件ValidatorForm類構造ActionForm
public class SubmitForm extends org.apache.struts.validator.ValidatorForm{...
2.修改ActionForm的validate()方法如下
 public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
 { 
   return super.validate(mapping, request);
 }
3.需要在JSP註冊檔案中的某一個地方新增 <html:errors/> 行以使錯誤顯示出來。
---------------------------------------------------------------------------------
客戶端的驗證
為了使用客戶端驗證,Action Form 應該擴充套件 ValidatorActionForm 而不是 ActionForm。
如前所述,對於伺服器端驗證,Action Form 擴充套件的是 ValidatorForm 類。

1.擴充套件ValidatorActionForm類構造ActionForm
public class SubmitForm extends org.apache.struts.validator.ValidatorActionForm {
2.伺服器端驗證時必需的<html:errors /> 在客戶端驗證時不再需要,刪除。
  去掉validate()方法
// public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
// { 
//   return super.validate(mapping, request);
// }
3.將<html:javascript formName="checkoutForm"/>加在jsp檔案末尾,即</html:html>前。
它的作用是將validation-rules.xml中與”checkoutForm”相關的校驗規則的javascript插入此頁面中。
4.在<html:form>中加onsubmit屬性。
  例如:<html:form action="/saveArticleType" onsubmit="return validateCheckoutForm(this);">
  說明:validateCheckoutForm()方法是在步驟3中自動生成的。
  <html:javascript>將根據formName的屬性值(例如:xxx),生成validatexxx()方法。
---------------------------------------------------------------------------------
擴充套件物件選擇
在為Form選擇擴充套件物件時,要注意:Struts框架提供了兩種選擇。
第一種選擇是使用ValidatorForm或者DynaValidatorForm;
第二種選擇是使用ValidatorActionForm或者DynaValidatorActionForm。
使用第一種方式時,Validator.xml中的form元素的name屬性必須和struts-config.xml中的action元素的name屬性相匹配。
使用第二種方式時,Validator.xml中的form元素的name屬性則是與struts-config.xml中的action元素的path屬性相匹配。

---------------------------------------------------------------------------------

在 JSP 中支援驗證
這些規則都不錯,但是仍然有一個顯著的問題:JSP 頁面沒有辦法報告錯誤!例如,如果這裡重新部署應用程式,將會發現用錯誤的值 提交驗證表單不會 轉向 success.jsp。這是對的,也是朝著正確方向的一步。但是,它也特別令人鬱悶;表單只是在瀏覽器中重新出現,至於出了什麼錯誤卻沒有任何指示。
請開啟 pages/test-validation.jsp 來處理這個問題。首先,需要提供了一個地方,供發生錯誤時顯示。這可以由 html:errors 元素很好地處理。請把以下內容插在 html:form 元素前:
            
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:html />
<html>
 <head>
  <title><bean:message key="valid.title" /></title>
 </head>              <html:errors />           
<html:form action="/SubmitValid" focus="username">
如果現在重新部署,並試著輸入錯誤資料,將開始看到錯誤訊息出現在<html:errors/>處

現在朝著真正堅固的驗證又進了一步。但是,仍然在伺服器端;在提交表單時會得到討厭的閃爍,然後不得不等待伺服器響應。這裡的目標是用 JavaScript 編碼的驗證(或者更好一些,不必為了每個表單手工編寫 JavaScript)。高興的是,只要幾個額外標記,Validator 就允許把它的伺服器端程式碼轉換成客戶端 JavaScript 指令碼:          
</html:form>
<html:javascript formName="ValidationForm" cdata="false" />
</body>
不是很多哦!只有一行程式碼,但是它告訴 Struts 插入所有支援表單客戶端驗證的 JavaScript。還請注意非常重要的 cdata 屬性。必須 把它設定成 false,否則客戶端驗證不會工作。如果把它設定成 true(預設設定),那麼 Struts 生成的 HTML 會把 JavaScript 放在 <![CDATA[ 和 ]]> 標記內。由於一些我不太清楚的原因,多數現代瀏覽器(Mozilla Firefox 和 Safari 在其中最出名)會忽略這樣包含的 JavaScript,所以客戶端驗證不會執行。
在這一階段,我要指出,即使忘記了 cdata=false 這一部分,仍然可以得到驗證,只不過是在伺服器端而已。在任何情況下,Validator 在伺服器端都會驗證資料,所以如果忘記了這個屬性、甚至關閉 JavaScript 或跳過它,也都會得到一個備份。使用 Validator 有一個很好的副作用 —— 它會嘗試並捕獲每個可能的錯誤。
(說明:如果按照作者的說法,得不到下面的測試結果,還需要修改一個地方)
修改檔案test-validation.jsp,增加onsubmit="validateValidationForm(this)
<html:form action="/SubmitValid" onsubmit="validateValidationForm(this)"  focus="username">

相關推薦

validator-rules.xml

今天學習了struts中的驗證框架驗證,Validator框架採用兩基於xml的配置檔案來配置驗證規則,這 兩個檔案為validator-rules.xml和validator.xml,在struts應用中,這兩個檔案必須存放在WEB-INF 目錄下。下面是對validato

轉載 logback的使用和logback.xml http://www.cnblogs.com/warking/p/5710303.html

version tor red java代碼 根節點 ext private 字符串 npe logback的使用和logback.xml詳解 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logb

XML

表示 空元素 定義 文本 結構化 要點 內容 連接 標記 XML是一種標記語言,用於描述數據,它提供一種標準化的方式來來表示文本數據。XML文檔以.xml為後綴。需要徹底註意的是XML是區分大小寫的。 第一行表明,本XML遵守的版本是1.0,使用的字符編碼是UTF-8字符集

轉:logback的使用和logback.xml

靈活 多說 maven path socket win error 輸出日誌 功能 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logback.qos.ch。它當前分為下面下個模塊:  logback-c

logback的使用和logback.xml

ons servle home 切換 內部 實現 負責 ace acc 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logback.qos.ch。它當前分為下面下個模塊:  logback-core:其它

15.javaweb XML教程

概念 text jvm 轉義 package fig 練習 編程 麗江 一、XML語言簡介 1, 作用:用於描述和保存現實中具有某種關系的數據,還可以作為軟件配置文件,和描述程序模塊之間的關系 2, 語法: 首先 先看一個XML文件的組成部分 關於文

Maven實戰:Pom.xml

enable sub 導航欄 deployed home pid 系統類型 介紹 corporate 什麽是pom? pom作為項目對象模型。通過xml表示maven項目,使用pom.xml來實現。主要描述了項目:包括配置文件;開發者需要遵循的規則,缺陷管理系統,組織

C#中的Linq to Xml

image 查詢 學習 ebo ret 遞增 xdoc 裏的 事件 前言 我相信很多從事.NET開發的,在.NET 3.5之前操作XML會比較麻煩,但是在此之後出現了Linq to Xml,而今天的主人公就是Linq to Xml,廢話不多說,直接進入主題。 一、生

Hibernate學習(2)- hibernate.cfg.xml

source nec cfg 更新 閱讀 username 詳解 格式化sql BE 1:主配置文件主要分為三部分:    註意:通常情況下,一個session-factory節點代表一個數據庫;    1.1:第一部分       數據庫連接部分,註意"hibernate

Java Pom.xml

build class文件 想要 單元測試 校驗 組成 例如 ons 版本庫 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema

【轉】logback的使用和logback.xml

操作 官方 觀察者 一是 變量定義 world! 是個 歸檔文件 connect from:https://www.cnblogs.com/warking/p/5710303.html 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件

maven全局配置文件settings.xml

lse global 合並 ever lips 依賴 setting files 完全 http://www.cnblogs.com/jingmoxukong/p/6050172.html?utm_source=gold_browser_extension 目錄 概要??

XMLXML語法

XML指可擴充套件標記語言很類似 HTML,被設計用來傳輸和儲存資料而非顯示資料,XML標籤沒有被預定義需要自行定義標籤,標籤具有自我描述性,同時XML也是 W3C 的推薦標準。 先來寫一個XML指令碼demo.xml: <?xml version="1.0" encoding="U

Hibernate ---核心配置檔案(Hibernate.cfg.xml)

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC     "-//Hibernate/Hibernate Configuration DTD

logback使用與配置檔案logback.xml

一、logback簡介 Logback由log4j創始人設計的另一個開源日誌元件,官網:http://logback.qos.ch。它當前分為下面三模組: logback-core:其它兩個模組的基礎模組 logback-classic:它是log4

maven settings.xml

 maven的配置一般使用conf資料夾下的預設settings.xml即可,也可以根據專案情況自己做一些配置。settings.xml中包含類似本地倉儲位置、修改遠端倉儲伺服器、認證資訊等配置。今天來總結一下maven的配置檔案的主要標籤。 <settings xmlns="h

Struts2框架之struts.xml

Struts2框架之struts.xml詳解 文章目錄 Struts2框架之struts.xml詳解 一個struts.xml的配置示例 package標籤的配置 action標籤的配置 result標

XML

    Xml   eXtendsible markup language 可擴充套件的標記語言   XML 有什麼用?   1. 可以用來儲存資料   2. 可以用來做配置檔案  

物件關係對映檔案(*.hbm.xml)

物件關係對映檔案,即POJO 類和資料庫的對映檔案*.hbm.xml(對映檔案的副檔名為 .hbm.xml)。 POJO 類和關係資料庫之間的對映可以用一個XML文件來定義。 通過 POJO 類的資料庫對映檔案,Hibernate可以理解持久化類和資料表之間的對

什麼是pom.xml?有什麼作用?--pom.xml

什麼是POM? POM是專案物件模型(Project Object Model)的簡稱,它是Maven專案中的檔案,使用XML表示,名稱叫做pom.xml。作用類似ant的build.xml檔案,功能更強大。該檔案用於管理:原始碼、配置檔案、開發者的資訊和角色、問題追蹤系統