继承了ActionSupport的自定义action类可以重写父类提供的validate校验方法,对一些字段进行校验。其原理是下面的拦截器:
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
validate方法默认对action类中的所有方法在其执行之前进行校验,可以使用注解的方式排除某个方法,如下:
@SkipValidation
public String save() {
return "success";
}
也可以自定义拦截方法,命名方式为validate+要拦截的方法名,构成拦截方法,如下:(只验证名为save的方法)
public void validateSave() {
System.out.println("validate");
System.out.println(password);
if(!this.getUserName().matches("[a-zA-Z]{4,9}")) {
this.addFieldError("userName", "用户名必须是4到9位大小写字母");
}
if(!((this.getPassword()+"").matches("\\d{0,1}"))){
this.addFieldError("password", "密码必须是0-1位数字");
}
}
只要验证不通过,即值栈中fieldErrors中有值,拦截器就不会放行,返回“input”,struts.xml中配置的方法也不会得到执行。
当然,本文的重点不是这些。在validation拦截器执行之前,还有一些赋值的拦截器,如:
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
在这些拦截器执行时,可能发生类型转换错误,如int类型越界,字符串转换为int发生转换错误。此时,struts2提供有默认的提示信息,在com/opensymphony/xwork2/xwork-messages.properties文件中有定义:
xwork.default.invalid.fieldvalue=Invalid field value for field "{0}".
开发中我们可能需要自定义文件来替换此提示信息,方法如下:
一、全局配置
在src根目录下建立message.properties,内容为:
xwork.default.invalid.fieldvalue=错误信息 (可以用{0}来替换相应的错误参数,如上)
在struts.xml中设置常量,内容如下:
下面的name可以在default.properties中找到
<constant name="struts.custom.i18n.resources" value="message"/>
二、局部配置
在Action类的包下建立文件 xxx.properties ,(xxx)与action类名相同,内容为:
值随便写
invalid.fieldvalue.password=\u65E0\u6CD5\u8F6C\u6362\u4E3A\u6570\u5B57
如果action中还有类对象,如下
invalid.fieldvalue.user.password=\u65E0\u6CD5\u8F6C\u6362\u4E3A\u6570\u5B57