三、struts2验证提高篇
3)注意:若一个Action类可以应答多个action请求,多个action请求使用不同的验证规则,怎么办?
为每一个不同的action请求定义其对应的验证文件:ActionClassName-AliasName-validation.xml
不带别名的配置文件:ActionClassName-validation.xml中的验证规则依然会发生作用,可以把一些公用的验证规则配置在其中,需要注意的是,只适用于某一个action的请求的验证规则就不要在这里配置了。
别名:就是struts配置文件中action的name对应的名称。
4)声明式验证框架原理
Struts2默认的拦截器栈中提供了一个validation拦截器
每个具体的验证规则都会对应具体的一个验证器,有一个配置文件把验证规则名称和验证器关联起来了。而实际上验证的是那个验证器。
位于com.opensymphony.xwork2.validator.validators下的default.xml
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
5)短路验证:若对一个字段使用多个验证器,默认情况下会执行所有的验证,若希望前面的验证没有通过,后面的不再验证,可以使用短路验证。
<field name="age">
<!-- 设置短路验证:若当前验证没有通过,则不再进行下一个验证 -->
<field-validator type="conversion" short-circuit="true">
<message>**Conversion Error Occurred</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message>Age needs to be between ${min} and ${max}</message>
</field-validator>
</field>
6)若类型转换失败,默认情况下还会执行后面的拦截器,还会进行验证。可以通过修改ConversionErrorInterceptor源代码的方式使当类型转换失败是,不在执行后续的验证拦截器,而直接返回input的result
Object action = invocation.getAction();
if (action instanceof ValidationAware) {
ValidationAware va = (ValidationAware) action;
if(va.hasFieldErrors()||va.hasActionErrors()){
//如果有错就不往后面走了
return "input";
}
}
7)关于非字段验证:不是针对某一个字段的验证
<!-- 测试非字段验证 -->
<validator type="expression">
<param name="expression"> <![CDATA[password==password2]]></param>
<message>Password is not equals to Password2</message>
</validator>
显示非字段验证的错误消息,使用s:actionerror标签:
<s:actionerror/>
课时3
错误消息的重用性
8)不同的字段使用同样的验证规则,而且使用同样的响应消息?
error.int=****${fieldName} needs to be between ${min} and ${max}
age=\u5E74\u9F84
count=\u6570\u91CF
课时4 自定义验证器
9)自定义验证器:
①定义一个验证器的类
》自定义的验证器都需要实现Validator
》可以选择继承ValidatorSupport或者FieldValidatorSupport
>若希望实现一个一般的验证器,则可以继承ValidatorSupport
》若希望实现一个字段验证器,则可以继承FieldValidatorSupport
》具体实现可以参考目前已经有的验证器
②在配置文件中配置验证器
》默认情况下,Struts2会在类路径的根目录下加载validators.xml文件,在该文件中加载验证器
该文件的定义方式同默认的验证器的那个配置文件:位于com.opensymphony.xwork2.validator.validators下的default.xml
》若类路径下没有指定的验证器,则从com.opensymphony.xwork2.validator.validators下的default.xml中的验证器加载
③使用:和目前的验证器一样
示例代码:自定义一个18位身份验证
编程验证 (不推荐)
Struts2提供了一个Validateable接口,可以使Action类实现这个接口以提供编程验证功能
ActionSupport类以及实现了Validateable接口
public void validate(){
if(name==null||name.trim().equals("")){
addFieldError("name",getText("name.null"));
}
}