对于login方法的校验,可以通过<ActionClassName>-<ActionAliasName>-validation.xml文件来校验,即RegistAction-login-validation.xml文件进行校验。同时,RegistAction-validation.xml的校验规则仍旧对login方法有效。即login方法的校验规则是Region-validation.xml和RegistAction-login-validation.xml的总和。
如果RegistAction继承了BaseAction,那么对于BaseAction类的校验规则也会被RegistAction类所继承校验。具体来说,其校验规则的搜索文件规则如下:
BaseAction-validation.xml
BaseAction-别名-validation.xml
RegistAction-validation.xml
RegistAction-别名-validation.xml
对于Struts2所支持的内建校验器,我们可以通过xwork.2.1.2.jar中的com/opensymphony/xwork2/validator/validators/default.xml文件查看。
除了配置文件,Struts2也支持Annotation。下面就是使用Annotation配置的RegistAction:
@Validation()
public class RegistAction extends ActionSupport {
private static final long serialVersionUID = -2113900523366315993L;
//该请求包含的4个请求参数
private String name;
private String pass;
private int age;
private Date birth;
public String getName() {
return name;
}
@RequiredStringValidator(type=ValidatorType.FIELD,key="name.required",message="")
@RegexFieldValidator(type=ValidatorType.FIELD,expression="\\w{4,25}",key="name.regex",message="")
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
@RequiredStringValidator(type=ValidatorType.FIELD,key="pass.required",message="")
@RegexFieldValidator(type=ValidatorType.FIELD,expression="\\w{4,25}",key="pass.regex",message="")
public void setPass(String pass) {
this.pass = pass;
}
public int getAge() {
return age;
}
@IntRangeFieldValidator(message="",key="age.range",min="1",max="150")
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
@DateRangeFieldValidator(message="",key="birth.range",min="1900/01/01",max="2050/01/21")
public void setBirth(Date birth) {
this.birth = birth;
}
}
对于不能通过内置校验器进行校验的逻辑,则可通过重写validate()方法来实现。如果一个Action中存在多个逻辑处理,则需要通过validateXxx()方法来分别进行校验,其中Xxx代表方法名。如login()方法对应的校验方法为validateLogin()。
Struts2的输入校验流程:
1。类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成Action的属性值。
2。在执行类型转换过程中,如果发生异常,则将异常保存到ActionContext中,并由conversionError拦截器负责将其封装到fieldError里。然后执行第3步;如无异常,直接执行第3步。
3。调用Struts2内置的输入校验规则进行输入校验
4。通过放射调用validateXxx()方法。
5。调用validate()方法。
6。如果上述都未发生fieldError,将调用Action里处理用户请求的处理方法;如果出现了fieldError,则转入input逻辑视图所指定的视图资源。