struts2的验证器是用的xwork里面的验证,自定义验证器就是根据源码继承已有的字段验证器而来。具体步骤如下:
1.展开xwork-2.0.4.jar,com.opensymphony.xwork2.validator.validators目录下有个default.xml,将它复制到项目根目录下改名叫validators.xml。
验证框架首先在根目录下找validators.xml文件,没找到validators.xml文件,验证框架将调用默认的验证设置,即default.xml里面的配置信息.
4.新建一个类(身份证验证为例:类名CardIdFieldValidator)继承FieldValidatorSupport,实现validate方法。

package org.siyn.commons.validators;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class CardIdFieldValidator extends FieldValidatorSupport
{

    public void validate(Object object) throws ValidationException
    {
        // 获得字段的名字
        String fieldName = getFieldName();
        // 获得输入界面输入的值
        String value = getFieldValue(fieldName, object).toString();

        if (value == null || value.length() <= 0)
            return;
        
        if(value.length()!=15 && value.length()!=18 )//身份证必须是15或18位!
            addFieldError(fieldName, object);
        
        if(value.length()==15)
            validate15CardId(value, object);
        if(value.length()==18)
            validate18CardId(value, object);
    }
    
    /** *//**
     * <p>18位身份证验证</p>
     * 
     * 根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
     * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
     * 
     * 第十八位数字(校验码)的计算方法为: 
     * 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
     * 2.将这17位数字和系数相乘的结果相加。 
     * 3.用加出来和除以11,看余数是多少? 
     * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。 
     * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
     * 
     * @date Oct 18, 2008
     * @param value
     * @param object
     */
    public void validate18CardId(String value, Object object)
    {
        // 获得字段的名字
        String fieldName = getFieldName();
        
        String tempStr = value.substring(0,17);
        String sourceCheckCode = value.substring(17,18);
        String checkCode = "";   
        int[] a = new int[17];   
        int i = 0;   
        try
        {
            while(i<17){   
                a[i] = Integer.parseInt(tempStr.substring(i,i+1));   
                i++;   
            }
        } catch (NumberFormatException e)
        {
            addFieldError(fieldName, object);
        }   
        int mod = (a[0]*7+a[1]*9+a[2]*10+a[3]*5+a[4]*8+a[5]*4+a[6]*2+a[7]*1+a[8]*6+a[9]*3+a[10]*7  
            +a[11]*9+a[12]*10+a[13]*5+a[14]*8+a[15]*4+a[16]*2)%11;   
        switch (mod){   
            case 10:    checkCode = "2";    break;   
            case 9:     checkCode = "3";    break;   
            case 8:     checkCode = "4";    break;   
            case 7:     checkCode = "5";    break;   
            case 6:     checkCode = "6";    break;   
            case 5:     checkCode = "7";    break;   
            case 4:     checkCode = "8";    break;   
            case 3:     checkCode = "9";    break;   
            case 2:     checkCode = "x";    break;   
            case 1:     checkCode = "0";    break;   
            case 0:     checkCode = "1";    break;   
        } 
        
        if(!sourceCheckCode.equalsIgnoreCase(checkCode))
            addFieldError(fieldName, object);
    }
    
    /** *//**
     * <p>15位身份证验证</p>
     * 
     * 只做了数字验证
     * @date Oct 18, 2008
     * @param value
     * @param object
     */
    public void validate15CardId(String value, Object object)
    {
        String fieldName = getFieldName();
        int i = 0; 
        try
        {
            while(i<15){   
                if(!Character.isDigit(value.charAt(i)))
                    addFieldError(fieldName, object);
                i++;   
            }
        } catch (NumberFormatException e)
        {
            addFieldError(fieldName, object);
        }
    }
}

5.在validators.xml中添加一个validator节点,和其他validator一样指定名称和类名,这里指定的name就是你将来要是使用的类型名字。

<validator name="cardid" class="org.siyn.commons.validators.CardIdFieldValidator"/>

到此自定义验证器就完成,剩下的就和使用自带的验证器一样了
6.新建action,继承ActionSupport或Action都行,写上相应需要验证的属性字段
7.新建验证文件xxxx-validation.xml,这个xxxx就是你前面action的类名字,xxx-xxx-validation.xml第二个xxx表示是jsp中的form提交action。

<field name="student.sfzh">
        <field-validator type="requiredstring" short-circuit="true">
            <message>身份证号不能为空.</message>
        </field-validator> 
        <field-validator type="cardid">
            <message>身份证号格式不正确.</message>
        </field-validator>
    </field>

8.配置struts.xml,以及action.
...

struts2自定义验证器(身份证验证)相关推荐

  1. struts2自定义拦截器一——模拟登陆权限验证

    1.http://localhost:8083/struts2/user.jsp 表示用户已登陆,存放session对象 2.http://localhost:8083/struts2/quit.js ...

  2. python 自定义装饰器 来验证函数参数

    # -*- coding: utf-8 -*- # by dl from inspect import signature # 用来获取函数的一些信息# 自定义参数验证装饰器 def typeasse ...

  3. Struts2 自定义拦截器(easy example)

    要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: 新建一个MyIntercept package com.action;imp ...

  4. laravel 验证器怎么验证json对象_Postman使用tv4进行JSON Schema结构验证和断言

    JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...

  5. struts2自定义拦截器并配置拦截器使其生效

    首先编写一个struts2的拦截器,要继承 MethodFilterInterceptor 并获取其中的方法 package star.july.d_interceptor;import com.op ...

  6. Struts2 自定义拦截器(方法拦截器)

    转自:http://05061107cm.iteye.com/blog/365504 struts2系统自带了很多拦截器,有时需要我们自己定义,一般有两种方式: 一.实现Interceptor接口 J ...

  7. Struts2自定义拦截器

    1. 需求 自定义拦截器实现,用户登录的访问控制. 2. 定义拦截器类 1 public class LoginInterceptor extends AbstractInterceptor 2 { ...

  8. Struts2 自定义拦截器

    所属栏目:AbstractInterceptor 如果要编写自定义拦截器,那么可以只用实现com.opensymphony.xwork2.interceptor.Interceptor这个接口即可. ...

  9. struts2自定义拦截器(登陆校验拦截器)

    需求:有些页面需要先登录才可以访问,如果没有登陆就跳转到login.jsp去登陆 此案例为访问login方法的时候不拦截,只有把user放到session中才可以访问别的方法 web.xml 配置拦截 ...

最新文章

  1. pip 无法卸载 pillow 解决方案 Not uninstalling pillow at /usr/lib/python3/dist-packages
  2. micro-mvc框架支持mvc各层业务代码热部署
  3. dart 乘方运算符_Dart系列-运算符
  4. @大学生|计算机专业怎么要怎么学?掌握这四点,毕业即就业!
  5. varnish的了解与常用配置使用
  6. 为什么不要在android log中打印中文_Android 开发:揭开App秒开的奥秘
  7. VMware系统运维(十一)部署虚拟化桌面 Horizon View 5.2 HTML ACCESS安装
  8. python之sklearn
  9. 设计模式 ( 十三 ) JDK动态代理模式
  10. 中国科学院国家授时中心
  11. 简单谈谈编程语言(一)
  12. 目标跟踪入门:使用OpenCV实现质心跟踪
  13. Shell 编程三剑客
  14. 【FreeRTOS】FreeRTOS学习笔记(3)— FreeRTOS任务与协程
  15. linux查找模糊文件位置,linux模糊查找文件用什么命令比较好
  16. ListView制作简单表格
  17. 胆囊结石在我们的生活中有哪些危害呢?
  18. 中国大公司罹患“大企业病” 国企成亏损重灾区
  19. 【微信小程序】使用canvas制作在线画板,清除与保存
  20. 博客搬家 pjblog 到 z-blog

热门文章

  1. 【5G系列】RLC (Radio Link Control )协议详解
  2. 基于MATLAB燃料电池控制系统测试平台
  3. 多智能体协同控制实验平台的研发
  4. 想进国企央企,一定要保存好所有工作履历证明材料,包括劳动合同、离职证明、社保记录等!...
  5. 计算机网络常见面试题,一网打尽!
  6. GD25Qxxx使用笔记
  7. vue循环jq渲染网页页面
  8. try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
  9. 异常解决:在实体引用中, 实体名称必须紧跟在 ‘‘ 后面
  10. 如何用计算机名安装打印机,如何添加打印机(如何在电脑上安装打印机?)