struts2的验证分为分编程式验证、声明式验证、注解式验证。因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证。
一.hello world
参考javaeye的这篇文章,按着做一次,起码有个初步印象
http://www.javaeye.com/wiki/taojintianxiastruts2/1650-17-7-note-the-use-of-struts2-validation
Validation使用名字叫做validator的Intercepter,在默认情况下,struts2已经定义了这个Intercepter,我们在不加声明的情况下就可以使用Validation了
如果是使用默认的拦截器,就已经开启了验证框架的了,直接用。
一般有两种注解法
1.直接注在get方法上面,像这种
@RequiredStringValidator(message="Supply password")
public String getPassword() {
return password;
}
2.注在方法上面,like
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="username",message="用户名不能为空!"),
@RequiredStringValidator(fieldName="telNum",message="电话号码不能为空!")
},
regexFields={@RegexFieldValidator(fieldName="telNum",expression="^(\\+86|0|1)\\d{10,11}$",
message="电话号码格式不正确!")}
)
但无论是哪种注解,默认情况下都是对这个action的所有方法进行验证。
如果验证不通过,将跳回result name 为 “input”的视图。错误信息是在 FieldError 里, 当然我们也可以用@InputConfig(resultName=“xxx”),设置验证不通过跳回的视图.
@SkipValidation 如果某个方法不想验证,那么就可以用这个标签了
默认配置下,验证框架是对所有方法都进行了验证,其实我们可以对不需要验证的方法上写了@SkipValidation注解。。但这样又出现了问题,若有两个方法都需要进行验证但参数又不相同,那怎么办呢?那就是开启方法级别的验证啦
二.开启方法级别的验证
开 启方法级别的验证只需要配置struts2的validation interceptor的一个参数validateAnnotatedMethodOnly为true即可。 默认情况下struts2的配置中没有配置这个参数,所以需要我们自己重新配置一下defaultStack:
<package name="yybean-default" extends="struts-default" abstract="true">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
</package>
其中重点就是
<!--开启方法级别的验证-->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
还有excludeMethods,这些方法都是不会执行验证的。
开启方法级别的验证后,对于不需要进行验证的方法没必要使用@SkipValidation注解。
三.常见的注解
注解 | 相应的XML | 描述 |
RequiredFieldValidator | required | 确保该属性不是null |
RequiredStringValidator | requiredstring | 确保一个String类型的属性不是null,并且非空 |
StringLengthFieldValidator | stringlength | 检查String的长度范围是否与所期望的一致 |
IntRangeFieldValidator | int | 检查int类型的数字是否超出所期望的大小范围 |
DoubleRangeFieldValidator | double | 检查double类型的数字是否超出所期望的大小范围 |
DateRangeFieldValidator | date | 检查date类型的属性是否超出所期望的范围 |
ExpressionValidator | expression | 使用值栈来估算一个ONGL表达式(必须要返回boolean值) |
FieldExpressionValidator | fieldexpression | 使用OGNL表达式来验证字段 |
EmailValidator | | 保证该属性是一个有效的email地址 |
UrlValidator | url | 保证该属性是一个有效的URL |
ConversionErrorFieldValidator | conversion | 检查该属性是否有转换错误 |
RegexFieldValidator | regex | 检查该属性的值是否与某个正则表达式相匹配。 |
VisitorFieldValidator | visitor | 把对字段的验证动作推迟到这个字段所属的类的特有的另一个验证文件中执行。 |
StringRegexValidator | n/a | 检查字符串是否与正则表达式匹配 |
CustomValidator | n/a | 表示使用了一个自定义的validator |
ValidationParameter | n/a | 作为CustomValidator 注解的一个参数 |
Validation | n/a | 表示该类使用了基于注解的验证——这个注解可以与接口或类一起使用 |
Validations | n/a | 用来对一个属性或类组合使用多种验证 |