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

时间: 08-20

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

ASP.NETMVC Model验证(四)

ASP.NETMVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型.

ASP.NET MVC Model验证(四)

ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型

struts2学习笔记(三)—— 在用户注册程序中使用验证框架

实现目标: 1.使用验证框架对用户注册信息进行验证 2.验证用户名.密码.邮箱不能为空 3.验证用户名.密码长度 4.验证邮件地址格式 具体实现 一.Struts2应用的基础配置 这里不做详细阐述,具体为web.xml.相关jar包的配置 二.将页面显示的文本内容放到资源文件中 1.查看用户注册程序中的所有页面,找到所有可以显示的文本内容,将它们分离出来放到资源文件中. 2.与相关的Action类同名,以.preperties为扩展名,与Action类位于同一个包中,只能由该Action访问 R

Struts2自定义拦截器

自定义拦截器 1). 具体步骤 I. 定义一个拦截器的类 > 可以实现 Interceptor 接口 > 继承 AbstractInterceptor 抽象类 II然后在拦截器类的interceptor()方法中定义这个拦截器的功能 III. 在 struts.xml 文件配置. 1注册拦截器 <interceptors> <interceptor name="hello" class="com.atguigu.struts2.intercept

jQuery Validate 表单验证插件----自定义校验结果样式

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script src="lib/jquery.validate.js" type="text/javascript"

jQuery Validate 表单验证插件----自定义一个验证方法

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script src="lib/jquery.validate.js" type="text/javascript"

12.Struts2自定义拦截器

12.自定义拦截器 拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, 即在Acton方法执行之前或之后执行,以加强Action方法的功能. 例如,一般情况下,用户在打开某个页面之前,需要先登录,否则是无法对资源进行访问的.这就是权限拦截器. 1.定义拦截器类 自定义的拦截器类需要实现拦截器接口com.opensymphony.xwork2.interceptor.Intercep

JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor{} //创建方式2: 继承AbstractInterceptor -> struts2的体贴 //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法 public class MyInterceptor2

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).