Struts2的输入验证(四)-自定义验证器与编程式验证

一、自定义验证器

1、实现步骤:

1)定义一个验证器的类

自定义验证器必须实现 Validator 接口,由于ValidatorSupport FieldValidatorSupport 实现了 Validator 接口,因此可以继承ValidatorSupport 或 FieldValidatorSupport 

Ⅰ. 若需要普通的验证程序,可以继承 ValidatorSupport 类;

Ⅱ. 若需要字段验证程序,可以继承 FieldValidatorSupport 类;

Ⅲ. 若验证程序需要接受一个输入参数,需要为这个参数增加一个相应的属性。

2)在配置文件中配置(注册)验证器

  注册验证程序:自定义验证器需要在类路径里的某个 validators.xml 文件里注册。

  默认情况下下,Struts2 会在 类路径的根目录下加载 validators.xml 文件,在该文件中加载验证器。该文件的定义方式与Struts2内建的默认验证器的配置文件相同(即位于 com.opensymphony.xwork2.validator.validators 下的 default.xml),如下图:

  
  若类路径下没有指定的验证器,则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载(即Struts2内建的验证器)
 
3)自定义验证器的使用方法:同Struts2内建的验证器使用方法相同。

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教程,感谢尚硅谷及佟刚老师的分享。

原文地址:https://www.cnblogs.com/KnightKitt/p/3931446.html