一、自定義驗證器
1、實現步驟:
1)定義一個驗證器的類
自定義驗證器必須實現 Validator 接口,由於ValidatorSupport 和 FieldValidatorSupport 實現了 Validator 接口,因此可以繼承ValidatorSupport 或 FieldValidatorSupport
Ⅰ. 若需要普通的驗證程序,可以繼承 ValidatorSupport 類;
Ⅱ. 若需要字段驗證程序,可以繼承 FieldValidatorSupport 類;
Ⅲ. 若驗證程序需要接受一個輸入參數,需要為這個參數增加一個相應的屬性。
2)在配置文件中配置(注冊)驗證器
注冊驗證程序:自定義驗證器需要在類路徑里的某個 validators.xml 文件里注冊。
默認情況下下,Struts2 會在 類路徑的根目錄下加載 validators.xml 文件,在該文件中加載驗證器。該文件的定義方式與Struts2內建的默認驗證器的配置文件相同(即位於 com.opensymphony.xwork2.validator.validators 下的 default.xml),如下圖:

2、示例:自定義驗證器
要求:自定義一個 18 位身份證驗證器
1)編寫驗證器類IDCardValidator:
1 package com.atguigu.struts2.validation.app; 2 import com.opensymphony.xwork2.validator.ValidationException; 3 import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; 4 public class IDCardValidator extends FieldValidatorSupport { 5 @Override 6 public void validate(Object object) throws ValidationException { 7 //1. 獲取字段的名字和值 8 String fieldName = getFieldName(); 9 Object value = this.getFieldValue(fieldName, object); 10 //2. 驗證 11 IDCard idCard = new IDCard(); 12 boolean result = idCard.Verify((String)value); 13 //3. 若驗證失敗, 則 ... 14 if(!result){ 15 addFieldError(fieldName, object); 16 } 17 } 18 } 19 20 //===下面是IDCard類=== 21 package com.atguigu.struts2.validation.app; 22 public class IDCard { 23 final int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 }; 24 final int[] vi = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 }; 25 private int[] ai = new int[18]; 26 public IDCard() {} 27 public boolean Verify(String idcard) { 28 if (idcard.length() == 15) { 29 idcard = uptoeighteen(idcard); 30 } 31 if (idcard.length() != 18) { 32 return false; 33 } 34 String verify = idcard.substring(17, 18); 35 if (verify.equals(getVerify(idcard))) { 36 return true; 37 } 38 return false; 39 } 40 public String getVerify(String eightcardid) { 41 int remaining = 0; 42 if (eightcardid.length() == 18) { 43 eightcardid = eightcardid.substring(0, 17); 44 } 45 if (eightcardid.length() == 17) { 46 int sum = 0; 47 for (int i = 0; i < 17; i++) { 48 String k = eightcardid.substring(i, i + 1); 49 ai[i] = Integer.parseInt(k); 50 } 51 for (int i = 0; i < 17; i++) { 52 sum = sum + wi[i] * ai[i]; 53 } 54 remaining = sum % 11; 55 } 56 return remaining == 2 ? "X" : String.valueOf(vi[remaining]); 57 } 58 public String uptoeighteen(String fifteencardid) { 59 String eightcardid = fifteencardid.substring(0, 6); 60 eightcardid = eightcardid + "19"; 61 eightcardid = eightcardid + fifteencardid.substring(6, 15); 62 eightcardid = eightcardid + getVerify(eightcardid); 63 return eightcardid; 64 } 65 }
2)在src目錄下建立 validators.xml 文件,並在其中進行注冊自定義的驗證器
<validators> <validator name="idcard" class="com.atguigu.struts2.validation.app.IDCardValidator"/> </validators>
3)在驗證配置文件中使用
<validators> <field name="idCard"> <field-validator type="idcard"> <message>It is not a idCard!</message> </field-validator> </field> </validators>
二、編程式驗證
Struts2 提供了一個 Validateable 接口,可以使 Action 類實現這個接口以提供編程式驗證功能。
ActionSupport 類已經實現了 Validateable 接口,因此通過繼承ActionSupport類可間接實現Validateable接口。
示例如下,判斷name是否為空:

注:該Struts2學習教程來自尚硅谷-佟剛-Struts2教程,感謝尚硅谷及佟剛老師的分享。
