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

  • 相关阅读:
    进程与线程
    软件过程2
    软件过程
    解决charles中options请求map local失败的问题
    工作心得
    II第七章:(1)Zuul路由网关
    II第九章:(1)Bus消息总线
    II第十一章:(1)Sleuth分布式请求链路跟踪
    II第八章:(1)Config分布式配置中心
    II第七章:(2)Gateway新一代网关
  • 原文地址:https://www.cnblogs.com/KnightKitt/p/3931446.html
Copyright © 2020-2023  润新知