在声明式验证中,只学会如何配置内置验证器是不行的,因为验证的配置中有很多技巧,那么这篇文章中会分析以下三个问题:
一. 若 Action 类对应多个 action 请求, 且 action 请求使用不同的验证规则
(1)为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-actionName-validation.xml
(2) 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个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)根据以上的步骤,我们需要建立两个配置文件
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
在这个例子中,界面和请求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)结果:
(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)运行结果:
可以看出自定义验证器已被框架识别。