Struts2 如何自定义一个验证器


为什么定义一个验证器?

虽然struts拦截器栈里面有很多的验证器,但是都是比较公共的,没有为某个属性专门做的,例如校验18位的身份证;


如何定一个验证器?

1、定义一个验证器的类

实现一个接口 validator,可以选择实现ValidatorSupport类或FieldValidatorSupprot类

  • 若希望实现一般的验证器可以继承ValidatorSupport类
  • 若希望实现一个字段验证器,则可以继承FieldValidatorSupprot类

具体是实现可以参考已经有的验证器

2、在配置文件中配置验证器

默认情况下·,Struts2会在类路径根目录下面加载validators.xml文件,在该文件中加载验证器

该文件的定义方式同默认的验证器的那个配置文件com.opensymphony.xwork2.validator.validators下面的default.xml

若类路径下面没有指定的验证器,则从源文件中找

3、使用和目前的验证器一样


示例代码

打开D:\workspace\LX\WebRoot\WEB-INF\lib\xwork-core-2.3.36.jar包

Struts2 如何自定义一个验证器_第1张图片

复制 RequiredFieldValidator,open type,打开类

Struts2 如何自定义一个验证器_第2张图片 

复制如下代码,以下是获取字段名和字段值的代码

Struts2 如何自定义一个验证器_第3张图片

 

在src目录下面,新建一个validators.xml文件

把default.xml文件里面的内容复制过来

注意:

1、name="haha"是你自定义的拦截类型的名称 calss是拦截的类的全路径






	


   

 

Identify.java

注意:继承FieldValidatorSupport类,重写方法,可以参考以下default.xml中的RequiredFieldValidator类

Struts2 如何自定义一个验证器_第4张图片

package cn.com.stack;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class Identify extends FieldValidatorSupport {
	/*
	 * author:命运的信徒 date:2018/12/18 arm:自定义一个验证器,校验18位的身份证
	 */
	@Override
	public void validate(Object object) throws ValidationException {
		// 1.获取字段的名字和值
		String fieldName = getFieldName();
		Object value = this.getFieldValue(fieldName, object);
		// 2.验证
		Idcard ca = new Idcard();
		boolean result = ca.getresult((String)value);
		// 3.若验证失败,则...
		System.out.println("result:"+result);
		if (!result) {
			addFieldError(fieldName, object);
		}
	}
}

我这里写了一个类,就是什么样的id是合法的,什么样的不是合法的

我写的比较简单,只是想要了解一下这个自制拦截器的机制

Idcard.java

package cn.com.stack;
public class Idcard {
	private boolean result;
	public boolean getresult(String s) {
		if (s.equals("342823199607253724")) {
			result = true;
		} else {

			result = false;
		}

		return result;
	}
}

基本的自制拦截器已经差不多了,现在就是如果出错了,显示错误信息的处理了,也就是验证信息;

确认要验证的字段

package cn.com.app;

import com.opensymphony.xwork2.ActionSupport;

public class Goods extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/*
	 * author:命运的信徒 date:2018/12/18 arm:相同的验证规则使用同一条相应消息
	 */
	/*private int goodnum;
	private int goodprice;*/
    private String id;
    
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	// 1.根据请求找到struts.xml文件
	// 2.根据请求的地址找到Action类
	// 3.第一步,params拦截器赋值
	// 4.执行到validation拦截器,字段的验证
	/*public int getGoodnum() {
		return goodnum;
	}

	public void setGoodnum(int goodnum) {
		this.goodnum = goodnum;
	}

	public int getGoodprice() {
		return goodprice;
	}

	public void setGoodprice(int goodprice) {
		this.goodprice = goodprice;
	}*/

}

验证的配置信息文件





	

	
		
		
			该用户身份证号不存在
		
	








页面


自定义一个验证器,校验18位的身份证

 Struts2 如何自定义一个验证器_第5张图片

 


 以上是学习的过程,可能比较混乱;

我们来整理一下,整个运行的过程;

首先在页面上

请输入身份证:**************

Struts2 如何自定义一个验证器_第6张图片

提交,向拦截器发送请求,如果是jsp或者是html请求就直接过滤掉,如果是struts2请求的话,就找到配置文件struts.xml文件,寻找合适的action请求(name一致)

Struts2 如何自定义一个验证器_第7张图片

通过struts.xml文件找到相应的Action类

Struts2 如何自定义一个验证器_第8张图片

首先由params拦截器给id赋值

这时候id的值就是你在前台页面输入的字符串;

这个Goods.java文件有相应的校验的机制

找到和字段名一致的field,根据字段校验的类型我们是haha,找校验的类

Struts2 如何自定义一个验证器_第9张图片

一般先从类的包下面找,然后在是根目录,如果都没找到,再去jar包下面找

我们自制校验器,都会在src根目录下面配置一个validators.xml,记住名字不是随意更改的

内容如下

记住,只是里面的name和class不一样

name="haha"和Goods-validation.xml里面的type="haha"是一致的

class="校验的内容的类的全路径"






	


   

Identify.java

怎么校验?

1、继承ValidationException类

2、实现方法

package cn.com.stack;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class Identify extends FieldValidatorSupport {
	/*
	 * author:命运的信徒 date:2018/12/18 arm:自定义一个验证器,校验18位的身份证
	 */
	@Override
	public void validate(Object object) throws ValidationException {
		// 1.获取字段的名字和值
		String fieldName = getFieldName();
		Object value = this.getFieldValue(fieldName, object);
		// 2.验证
		Idcard ca = new Idcard();
		boolean result = ca.getresult((String)value);
		// 3.若验证失败,则...
		System.out.println("result:"+result);
		if (!result) {
			addFieldError(fieldName, object);
		}
	}
}

成功结束!

你可能感兴趣的:(java之ssh框架专栏)