10.4 注解方式下实现用户输入验证
Struts2框架也提供了基于注解方式定义验证规则。
10.4.1 注解方式下用户输入验证的实现
以下是基于 Struts2框架下注解的方式对用户登录的案例的用户输入验证。该方式无需额外的配置文件,只需要在 Action中增加相应的注解即可。具体实现代码结构如下图 (与基于编码方式下实现的程序结构一致 )所示 :
图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="密码长度必须在6到12位之间."
)
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文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
3. 具体用法:
@RequiredFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l RequiredStringValidator注解
1. 作用:
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
trim | 否 | true | 在进行验证规则前,是否要去掉字符串的首尾空格 |
3. 具体用法:
@RequiredStringValidator(message= "Default message", key = "i18n.key", shortCircuit = true,trim = true)
l IntRangeFieldValidator注解
1. 作用:
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
min | 否 | | 整数的最小值 |
max | 否 | | 整数的最大值 |
3. 具体用法:
@IntRangeFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true,min = "0", max = "42")
l DoubleRangeFieldValidator注解
1. 作用:验证是指定范围内的double值,如果没有指定最小值和最大值,本验证规则将什么也不做。
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
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文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
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文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
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文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
expression | 是 | | 用于验证的OGNL表达式,该表达式的结果为Boolean类型 |
3. 具体用法:
@FieldExpressionValidator(message= "Default message", key = "i18n.key", shortCircuit = true,expression = "an OGNL expression")
l EmailValidator注解
1. 作用:
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
3. 具体用法:
@EmailValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l UrlValidator注解
1. 作用:用于验证是否为一个合法的URL的注解
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
3. 具体用法:
@UrlValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l VisitorFieldValidator注解
1. 作用:用于验证字段为JavaBean类型的注解
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
context | 否 | Action的别名 | 指定验证发生的上下文 |
appendPrefix | 否 | true | 制定是否要添加字段前缀 |
3. 具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l ConversionErrorFieldValidator注解
1. 作用:检查字段是否有任何类型转换错误。
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
3. 具体用法:
@ConversionErrorFieldValidator(message= "Default message", key = "i18n.key", shortCircuit = true)
l StringLengthFieldValidator注解
1. 作用:验证字段是否在正确的长度范围内
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
trim | 否 | true | Boolean类型值。判断字符串长度前是否先去掉前后空格。 |
minLength | 否 | | 整数值,字符串长度的最小长度值 |
maxLength | 否 | | 整数值,字符串长度的最大长度值 |
3. 具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l RegexFieldValidator注解
1. 作用:对字段进行正则表达式验证
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
expression | 是 | | 用于验证的正则表达式 |
3. 具体用法:
@RegexFieldValidator(key = "regex.field", expression = "yourregexp")
l customValidator注解
1. 作用:自定义校验器注解
2. 参数及其含义:
参数名 | 是否必须 | 缺省值 | 说明 |
message | 是 | | 字段错误信息 |
key | 否 | | 从特定的Properties文件中获取文本的i18n的Key值 |
fieldname | 否 | | 字段名称 |
shortCircuit | 否 | false | 是否用于短路操作 |
type | 是 | ValidatorType.FIELD | 枚举值,可以是 FIELD 或 SIMPLE |
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;
}