struts2之声明式验证后续及自定义验证器

在声明式验证中,只学会如何配置内置验证器是不行的,因为验证的配置中有很多技巧,那么这篇文章中会分析以下三个问题:

一. 若 Action 类对应多个 action 请求, 且 action 请求使用不同的验证规则

(1)为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-actionName-validation.xml

(2) 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个action 
公有的验证规则配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了.

直接上例子:

假设要求:我们在注册的时候年龄范围必须在20-30之间,但是在成为用户而需要修改的时候则要求在30-50之间(只是个例子,大家看方法就行了)

(1)首先需要一个Action类,只需一个年龄属性,即age

import com.opensymphony.xwork2.ActionSupport;

public class VariousAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private int age;

	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
}
(2)根据以上的步骤,我们需要建立两个配置文件
对应注册的配置文件:文件名为VariousAction-ageregister-validation.xml





	
		
			20
			30
			年龄必须在${min}与${max}之间
		
	
对应修改的配置文件:文件名为VariousAction-agemodify-validation.xml



  		

	
		
			30
			50
			年龄必须在${min}与${max}之间
		
	
注册和修改页面内容都一样,唯一不同的就是actionName不同,注册界面中表单的action=“ageregister”,修改界面中action=“agemodify”


	
	
	
(3)最后需要在struts.xml中配置

 
       
       		/ageregister.jsp
       		/success.jsp
       
       
       
       		/agemodify.jsp
       		/success.jsp
       


运行结果,注册和修改界面分别对应为:

struts2之声明式验证后续及自定义验证器_第1张图片struts2之声明式验证后续及自定义验证器_第2张图片

在这个例子中,界面和请求action都是不同的,但是在后台所属的Action类是同一个,而这两个验证的实现就在于这两个配置文件,struts2框架通过配置文件的名字与action相对应,然后执行。


二. 非字段验证: 不是针对于某一个字段的验证. 

在这里有个非常典型的案例,就是在注册的时候的密码验证问题,那么就接着上面的例子,以年龄注册Action为例。

(1)在Action类中加入两个字段:private String password1、private String password2;

(2)修改上面的年龄注册验证文件如下:





	
		
			20
			30
			年龄必须在${min}与${max}之间
		
	

	
	
	
		password1==password2
		两次密码必须相同
	

这里需要注意的是在exception参数中一般会有比较符号可能会影响xml的规范所以在此参数中,所以一般会写在 ![CDATA[]]中

所以配置文件中的expression参数可以配置为:

(3)配置文件不需改动,在年龄注册界面中加入:


在这里需要注意的一点是这个错误是action类型的错误,应该加上s:actionerror 标签才能显示出来:

(4)结果:

struts2之声明式验证后续及自定义验证器_第3张图片

        
三. 自定义验证器:

(1)定义一个验证器的类
自定义的验证器都需要实现 Validator. 也可以选择继承它的实现类如: ValidatorSupport 或  FieldValidatorSupport 类。若希望实现一个一般的验证器, 则可以继承 ValidatorSupport,若希望实现一个字段验证器,  则可以继承 FieldValidatorSupport。

(2)在配置文件中配置验证器

配置验证器的方法和之前的内置器是一样的,在这里主要说的是把自定义的验证器配置到struts2框架中。默认情况下下, struts2 会在 类路径的根目录下加载 validators.xml 文件, 在该文件中加载验证器,该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml。如果validators.xml文件中没有当前的验证器,会转往default.xml文件中寻找。

既然了解了步骤,那么就以简单例子说明,接着上面的例子:

先说一下需求,不允许用户所输入的字符串中是否含有空格。

(1)原理很简单,只需要用String类里的contains()方法即可,那么自定义字段验证器为:

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

public class BlankValidator extends FieldValidatorSupport {

	@Override
	public void validate(Object object) throws ValidationException {
		
		String name = getFieldName();//获取字段的名字
		Object fieldValue = getFieldValue(name, object);//获取字段的值
		String value = (String)fieldValue;//强转为String类型
		//如果包含空格,则加入所要提醒的字段错误 即在配置文件中所写的
		if(value.contains(" ")){
			addFieldError(name, object);
		}
	}

}

(2)将自定义验证器注册到struts2框架中

在src下创建validators.xml文件






	

(3)修改年龄注册的验证配置文件,给两个密码字段加入空格验证





	
		
			20
			30
			年龄必须在${min}与${max}之间
		
	
	
	
	
		
			字段中不能含有空格
		
	
	
		
			字段中不能含有空格
		
	
 
  

(4)运行结果:

struts2之声明式验证后续及自定义验证器_第4张图片

可以看出自定义验证器已被框架识别。



你可能感兴趣的:(struts2)