Struts2 annotation方法验证

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

保证该属性是一个有效的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

用来对一个属性或类组合使用多种验证

猜你喜欢

转载自baobeituping.iteye.com/blog/2157436