Struts2的輸入驗證(四)-自定義驗證器與編程式驗證

1、自定義驗證器

一、實現步驟:

1)定義一個驗證器的類編程

自定義驗證器必須實現 Validator 接口,因爲ValidatorSupport FieldValidatorSupport 實現了 Validator 接口,所以能夠繼承ValidatorSupport 或 FieldValidatorSupport app

Ⅰ. 若須要普通的驗證程序,能夠繼承 ValidatorSupport 類;ide

Ⅱ. 若須要字段驗證程序,能夠繼承 FieldValidatorSupport 類;學習

Ⅲ. 若驗證程序須要接受一個輸入參數,須要爲這個參數增長一個相應的屬性。ui

2)在配置文件中配置(註冊)驗證器this

  註冊驗證程序:自定義驗證器須要在類路徑裏的某個 validators.xml 文件裏註冊。spa

  默認狀況下下,Struts2 會在 類路徑的根目錄下加載 validators.xml 文件,在該文件中加載驗證器。該文件的定義方式與Struts2內建的默認驗證器的配置文件相同(即位於 com.opensymphony.xwork2.validator.validators 下的 default.xml),以下圖:code

  
  若類路徑下沒有指定的驗證器,則從 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的驗證器加載(即Struts2內建的驗證器)
 
3)自定義驗證器的使用方法:同Struts2內建的驗證器使用方法相同。

二、示例:自定義驗證器

 要求:自定義一個 18 位身份證驗證器xml

1)編寫驗證器類IDCardValidator:blog

 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>

2、編程式驗證

Struts2 提供了一個 Validateable 接口,能夠使 Action 類實現這個接口以提供編程式驗證功能。

ActionSupport  類已經實現了 Validateable 接口,所以經過繼承ActionSupport類可間接實現Validateable接口。

示例以下,判斷name是否爲空:

 

 

 

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

相關文章
相關標籤/搜索