为什么定义一个验证器?
虽然struts拦截器栈里面有很多的验证器,但是都是比较公共的,没有为某个属性专门做的,例如校验18位的身份证;
如何定一个验证器?
1、定义一个验证器的类
实现一个接口 validator
具体是实现可以参考已经有的验证器
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包
复制 RequiredFieldValidator,open type,打开类
复制如下代码,以下是获取字段名和字段值的代码
在src目录下面,新建一个validators.xml文件
把default.xml文件里面的内容复制过来
注意:
1、name="haha"是你自定义的拦截类型的名称 calss是拦截的类的全路径
Identify.java
注意:继承FieldValidatorSupport类,重写方法,可以参考以下default.xml中的RequiredFieldValidator类
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位的身份证
以上是学习的过程,可能比较混乱;
我们来整理一下,整个运行的过程;
首先在页面上
请输入身份证:**************
提交,向拦截器发送请求,如果是jsp或者是html请求就直接过滤掉,如果是struts2请求的话,就找到配置文件struts.xml文件,寻找合适的action请求(name一致)
通过struts.xml文件找到相应的Action类
首先由params拦截器给id赋值
这时候id的值就是你在前台页面输入的字符串;
这个Goods.java文件有相应的校验的机制
找到和字段名一致的field,根据字段校验的类型我们是haha,找校验的类
一般先从类的包下面找,然后在是根目录,如果都没找到,再去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);
}
}
}
成功结束!