10.4 注解方式下实现用户输入验证

         Struts2框架也提供了基于注解方式定义验证规则。

       10.4.1 注解方式下用户输入验证的实现

         以下是基于Struts2框架下注解的方式对用户登录的案例的用户输入验证。该方式无需额外的配置文件,只需要在Action中增加相应的注解即可。具体实现代码结构如下图(与基于编码方式下实现的程序结构一致)所示:
Struts2用户输入验证(4)_的
图10-1 基于注解方式下用户登陆功能代码结构
程序中LoginAction类中完成了基于注解方式下的用户输入验证,该文件具体代码如下所示:
package com.study.erp.action;
import com.opensymphony.xwork2.ActionSupport;
importcom.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;
importcom.opensymphony.xwork2.validator.annotations.ValidatorType;
public class LoginAction extends ActionSupport{
    privateString username;
    privateString password;
    publicString getUsername() {
        returnusername;
    }
    @RequiredStringValidator(
                type=ValidatorType.FIELD,
                message="用户名不能为空."
    )
    publicvoid setUsername(String username) {
        this.username= username;
    }
    publicString getPassword() {
        returnpassword;
    }
    @RequiredStringValidator(
                type=ValidatorType.FIELD,
                message="密码不能为空."
    )
    @StringLengthFieldValidator(
                type=ValidatorType.FIELD,
                minLength="6",
                maxLength="12",
                message="密码长度必须在612位之间."
    )
    publicvoid setPassword(String password) {
        this.password= password;
    }
    publicString execute(){
            return"success";
    }
}
         在完成username属性赋值之前,进行了非空的验证。注解方式下字符串非空验证规则名为RequiredStringValidator, 完成password属性赋值之前,进行了非空的验证和长度验证。注解方式下字符串长度验证规则名为StringLengthFieldValidator。以上所有方式下均是字段级验证因此,type属性值设置为ValidatorType.FIELD.其余属性含义与基于配置方式下的属性含义相同。

       10.4.2 基于注解的验证语法

         基于注解方式的验证语法需要进行如下的配置:
1.        如果使用字段级的验证,则使用具体的注解验证规则修饰各个需要进行验证的属性所对应的set方法,该方式下的具体语法:
@基于注解的验证规则名称(
属性名1 = "属性值1",
属性名2 = "属性值2",
……
)
public void setXxx(…){…}
 
2.        如果使用简单的验证,则具体的验证配置信息要写在execute方法之前。该方式下的具体语法:
@Validations(
                            属性名1 =
                           {@属性所对应的验证规则名称(type =ValidatorType.SIMPLE, fieldName = "验证的字段名",属性名1 = "属性值1",属性名2 = "属性值2",…)},
                       ……
)
public void execute(){……}

10.4.3内置注解验证

Struts2提供了16个内置注解验证,接下来我们来看一下这些注解验证。
校验器名称
作用
级别
RequiredFieldValidator
必填校验器
方法级
RequiredStringValidator
必填字符串校验器
方法级
IntRangeFieldValidator
整型范围校验器
方法级
DoubleRangeFieldValidator
双精度浮点型范围校验器
方法级
DateRangeFieldValidator
日期型校验器
方法级
ExpressionValidator
表达式校验器
方法级
FieldExpressionValidator
字段表达式校验器
方法级
EmailValidator
电子邮件校验器
方法级
UrlValidator
网址校验器
方法级
VisitorFieldValidator
Visitor校验器
方法级
ConversionErrorFieldValidator
转换校验器
方法级
StringLengthFieldValidator
字符串长度校验器
方法级
RegexFieldValidator
正则表达式校验器
方法级
CustomValidator
自定义验证器
方法级或者类级
Validations
一个方法使用相同类型的多个注解时使用
方法级
Validation
类或接口的验证规则
类级(已过时)
10- Struts2提供的内置注解验证
         下面就这些内置的注解验证逐个进行说明:
l           RequiredFieldValidator注解
1.             作用:
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
3.             具体用法:
@RequiredFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l  RequiredStringValidator注解
1.             作用:
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
trim
true
在进行验证规则前,是否要去掉字符串的首尾空格
3.             具体用法:
@RequiredStringValidator(message= "Default message", key = "i18n.key", shortCircuit = true,trim = true)
l  IntRangeFieldValidator注解
1.             作用:
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
min
 
整数的最小值
max
 
整数的最大值
3.             具体用法:
@IntRangeFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true,min = "0", max = "42")
l  DoubleRangeFieldValidator注解
1.             作用:验证是指定范围内的double值,如果没有指定最小值和最大值,本验证规则将什么也不做。
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
minInclusive
 
Double类型可包含的最小值
maxInclusive
 
Double类型可包含的最大值
minExclusive
 
Double类型不包含的最小值
maxExclusive
 
Double类型不包含的最大值
3.             具体用法:
@DoubleRangeFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true,minInclusive = "0.123", maxInclusive = "99.987")
l  DateRangeFieldValidator注解
1.             作用:验证是否在某个指定的日期范围内
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
min
 
日期的最小值
max
 
日期的最大值
3.             具体用法:
@DateRangeFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true,min = "2005/01/01", max = "2005/12/31")
l  ExpressionValidator注解
1.             作用:运用表达式进行验证的非字段级验证注解
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
expression
 
用于验证的OGNL表达式,该表达式的结果为Boolean类型
3.             具体用法:
@ExpressionValidator(message= "Default message", key = "i18n.key", shortCircuit = true,expression = "an OGNL expression" )
l  FieldExpressionValidator注解
1.             作用:使用OGNL表达式来实现的验证器
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
expression
 
用于验证的OGNL表达式,该表达式的结果为Boolean类型
3.             具体用法:
@FieldExpressionValidator(message= "Default message", key = "i18n.key", shortCircuit = true,expression = "an OGNL expression")
l  EmailValidator注解
1.             作用:
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
3.             具体用法:
@EmailValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l  UrlValidator注解
1.             作用:用于验证是否为一个合法的URL的注解
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
3.             具体用法:
@UrlValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l  VisitorFieldValidator注解
1.             作用:用于验证字段为JavaBean类型的注解
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
context
Action的别名
指定验证发生的上下文
appendPrefix
true
制定是否要添加字段前缀
3.             具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l  ConversionErrorFieldValidator注解
1.             作用:检查字段是否有任何类型转换错误。
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
3.             具体用法:
@ConversionErrorFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l  StringLengthFieldValidator注解
1.             作用:验证字段是否在正确的长度范围内
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
trim
true
Boolean类型值。判断字符串长度前是否先去掉前后空格。
minLength
 
整数值,字符串长度的最小长度值
maxLength
 
整数值,字符串长度的最大长度值
 
3.             具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l  RegexFieldValidator注解
1.             作用:对字段进行正则表达式验证
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
 
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
expression
 
用于验证的正则表达式
 
3.             具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l  customValidator注解
1.             作用:自定义校验器注解
2.             参数及其含义:
参数名
是否必须
缺省值
说明
message
 
字段错误信息
key
 
从特定的Properties文件中获取文本的i18nKey
fieldname
 
字段名称
shortCircuit
false
是否用于短路操作
type
ValidatorType.FIELD
枚举值,可以是FIELDSIMPLE
3.             具体用法:
@ CustomValidator(type="customValidatorName", fieldName = "myField")
l  Validations注解
1.             作用:用于组织验证注解
2.             参数及其含义:
参数名
是否必须
缺省值
说明
requiredFields
 
添加RequiredFieldValidators集合
customValidators 
 
添加CustomValidators集合
conversionErrorFields
 
添加ConversionErrorFieldValidators集合
dateRangeFields
 
添加DateRangeFieldValidators集合
emails
 
添加EmailValidators集合
fieldExpressions 
 
添加FieldExpressionValidators集合
intRangeFields 
 
添加IntRangeFieldValidators集合
requiredStrings 
 
添加RequiredStringValidators集合
stringLengthFields 
 
添加StringLengthFieldValidators集合
urls 
 
添加UrlValidators集合
visitorFields 
 
添加VisitorFieldValidators集合
regexFields 
 
添加RegexFieldValidator集合
expressions 
 
添加RegexFieldValidator集合
3.             具体用法:
@Validations(
          requiredFields ={@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName ="customfield", message = "You must enter a value forfield.")},
          requiredStrings ={@RequiredStringValidator(type= ValidatorType.SIMPLE, fieldName = "stringisrequired", message ="You must enter a value for string.")},
          emails ={ @EmailValidator(type =ValidatorType.SIMPLE, fieldName = "emailaddress", message = "Youmust enter a value for email.")},
          urls ={ @UrlValidator(type =ValidatorType.SIMPLE, fieldName = "hreflocation", message = "Youmust enter a value for email.")},
          stringLengthFields={@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true,minLength="10" , maxLength = "12", fieldName ="needstringlength", message = "You must enter astringlength.")},
          intRangeFields ={ @IntRangeFieldValidator(type= ValidatorType.SIMPLE, fieldName = "intfield", min = "6",max = "10", message = "bar must be between ${min} and ${max},current value is ${bar}.")},
          dateRangeFields={@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName ="datefield", min = "-1", max = "99", message ="bar must be between ${min} and ${max}, current value is ${bar}.")},
          expressions = {
@ExpressionValidator(expression = "foo > 1", message ="Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
              @ExpressionValidator(expression ="foo > 2", message = "Foo must be greater than Bar 2. Foo =${foo}, Bar = ${bar}."),
              @ExpressionValidator(expression ="foo > 3", message = "Foo must be greater than Bar 3. Foo =${foo}, Bar = ${bar}."),
              @ExpressionValidator(expression ="foo > 4", message = "Foo must be greater than Bar 4. Foo =${foo}, Bar = ${bar}."),
              @ExpressionValidator(expression ="foo > 5", message = "Foo must be greater than Bar 5. Foo =${foo}, Bar = ${bar}.")
  } )
  public String execute() throws Exception {
      return SUCCESS;
  }