Struts2 如何自定义一个验证器

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/85060770

为什么定义一个验证器?

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


如何定一个验证器?

1、定义一个验证器的类

实现一个接口 validator<T>,可以选择实现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包

复制 RequiredFieldValidator,open type,打开类

 

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

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

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

注意:

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
	<validator name="haha"	class="cn.com.stack.Identify" />
</validators>
<!--  END SNIPPET: validators-default -->
   

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;
	}*/

}

验证的配置信息文件



<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
	<!-- 针对goodnum goodprice属性进行验证 -->
<!-- 	<field name="goodprice">
		-字段范围内
		<field-validator type="int">
			<param name="min">20</param>
			<param name="max">50</param>
			<message key="error_age"></message>
		</field-validator>
	</field>
	<field name="goodnum">
		-字段范围内
		<field-validator type="int">
			<param name="min">10</param>
			<param name="max">20</param>
			<message key="error_age"></message>
		</field-validator>
	</field> -->
	<field name="id">
		<!-- -字段范围内 -->
		<field-validator type="haha">
			<message>该用户身份证号不存在</message>
		</field-validator>
	</field>
</validators>







页面

<body>
<h4>自定义一个验证器,校验18位的身份证</h4>
<s:form action="good.action">
<s:textfield label="请输入身份证" name="id"></s:textfield>
<s:submit></s:submit>
<s:fielderror fieldName="id"></s:fielderror>
</s:form>
</body>

 


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

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

首先在页面上

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

提交,向拦截器发送请求,如果是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="校验的内容的类的全路径"

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
	<validator name="haha"	class="cn.com.stack.Identify" />
</validators>
<!--  END SNIPPET: validators-default -->
   

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);
		}
	}
}

成功结束!

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/85060770