这种基于Annotation的输入校验实质上也属于Struts 2“零配置”特性的部分,它允许使用Annotation来定义每个字段应该满足的规则,Struts 2com.opensymphony.xwork2.validator.annotations包下提供了大量校验器相关的Annotation,这些Annotation和前面介绍的验证器大致上一一对应,读者可以自行查阅API文档。

为了在Action类通过Annotation指定验证规则,经过如下配置即可:

Ø  使用验证器Annotation修饰Action里各属性对应的setter方法。

下面我们在前面I18NValidate应用的基础上进行修改,将该应用的WEB-INF\src\lee路径下的校验规则文件删除,修改该路径下的RegistAction.java文件,通过注释指定各属性应该满足的规则。修改后的Action代码如下所示。

程序清单:codes\04\4.2\annotation\WEB-INF\src\org\crazyit\app\action\RegistAction.java

 

  1. public class RegistAction extends ActionSupport  
  2. {  
  3.     private String name;  
  4.     private String pass;  
  5.     private int age;  
  6.     private Date birth;   
  7.     //name属性的setter和getter方法  
  8.     //使用Annotation指定必填、正则表达式两个校验规则  
  9.     @RequiredStringValidator(key = "name.requried" 
  10.         , message = "")  
  11.     @RegexFieldValidator(expression = "\\w{4,25}" 
  12.         ,key = "name.regex" , message = "")  
  13.     public void setName(String name)  
  14.     {  
  15.         this.name = name;  
  16.     }  
  17.     public String getName()  
  18.     {  
  19.         return this.name;  
  20.     }  
  21.     //pass属性的setter和getter方法  
  22.     @RequiredStringValidator(key = "pass.requried" 
  23.         ,message = "")  
  24.     @RegexFieldValidator(expression = "\\w{4,25}" 
  25.         ,key = "pass.regex" ,message = "")  
  26.     public void setPass(String pass)  
  27.     {  
  28.         this.pass = pass;  
  29.     }  
  30.     public String getPass()  
  31.     {  
  32.         return this.pass;  
  33.     }  
  34.     //age属性的setter和getter方法  
  35.     @IntRangeFieldValidator(message = "" 
  36.         , key = "age.range", min = "1" 
  37.         , max = "150")  
  38.     public void setAge(int age)  
  39.     {  
  40.         this.age = age;  
  41.     }  
  42.     public int getAge()  
  43.     {  
  44.         return this.age;  
  45.     }  
  46.     //birth属性的setter和getter方法  
  47.     //使用Annotation指定日期范围校验规则  
  48.     @DateRangeFieldValidator(message = "" 
  49.         , key = "birth.range", min = "1900/01/01" 
  50.         , max = "2050/01/21")  
  51.     public void setBirth(Date birth)  
  52.     {  
  53.         this.birth = birth;  
  54.     }  
  55.     public Date getBirth()  
  56.     {  
  57.         return this.birth;  
  58.     }  
  59. }  

上面Action的粗体字代码使用了验证器Annotation修饰了各属性的setter方法,这样Struts 2就知道了各属性应该满足怎样的规则。通过在Action中使用Annotation指定各字段应该满足的校验规则,就可以避免书写XML校验规则文件。

关于使用Annotation来代替XML配置文件,这是JDK 1.5新增Annotation后的一个趋势,使用这种方式无须编写XML文件,从而可以简化应用开发,但带来的副作用是所有内容都被写入Java代码中,会给后期维护带来一定困难。