struts2注解方式的验证

struts2的验证分为分编程式验证、声明式验证、注解式验证。因如今的人愈来愈懒,都追求零配置,因此本文介绍下注解式验证。html

一.hello worldjava

参考javaeye的这篇文章,按着作一次,起码有个初步印象正则表达式

http://www.javaeye.com/wiki/taojintianxiastruts2/1650-17-7-note-the-use-of-struts2-validationexpress

Validation使用名字叫作validator的Intercepter,在默认状况下,struts2已经定义了这个Intercepter,咱们在不加声明的状况下就可使用Validation了apache

若是是使用默认的拦截器,就已经开启了验证框架的了,直接用。编程

开启验证的方式是(官网):框架

打开验证

默认拦截器堆栈“defaultStack”已经打开验证。在建立本身的拦截器堆栈必定要包括validationworkflow拦截器。来自struts-default.xmlui

<interceptor-stack name="defaultStack"> ... <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack> 

从版本2.0.4开始,Struts为XWork的com.opensymphony.xwork2.validator.ValidationInterceptor 拦截器提供了扩展this

<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> 

这个拦截器容许咱们经过使用@org.apache.struts2.interceptor.validation.SkipValidation action方法注解来关闭特定方法的验证编码

即自定义的拦截器栈须要加上上述标红的部分,这样才能开启验证,验证才会起做用

 

通常有两种注解法

 

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="电话号码格式不正确!")}

)

@RequiredStringValidator表明进行字符串非空验证,fildName是指须要验证的参数名称,message为验证失败后显示的信息。

但不管是哪一种注解,默认状况下都是对这个action的全部方法进行验证。

 

若是验证不经过,将跳回result name 为 “input”的视图。错误信息是在 FieldError 里, 固然咱们也能够用@InputConfig(resultName=“xxx”),设置验证不经过跳回的视图.

@InputConfig(resultName=“xxx”)要配置在action类的方法上,用来更改当前方法若是验证出错的调回视图,能够更改默认的input,注意@InputConfig(resultName=“xxx”)只会对当前action配置的当前方法起做用,不管开不开启方法级别的校验都是只对当前action配置的当前方法起做用。

 显示错误的方式:<s:fielderror fieldName="验证的类的成员变量名"></s:fielderror> (

<s:fielderror /><!-- 不写fieldName属性显示全部的fielderror错误 -->

)或者使用el来取值栈中的错误

 

@SkipValidation 若是某个方法不想验证,那么就能够用这个标签了

 

默认配置下,验证框架是对全部方法都进行了验证,其实咱们能够对不须要验证的方法上写了@SkipValidation注解。。但这样又出现了问题,如有两个方法都须要进行验证但参数又不相同,那怎么办呢?那就是开启方法级别的验证啦

注意:默认状况下配置的@Validations是对当前action类中的全部方法起做用的,不论它具体是配置在哪一个方法上面

 

二.开启方法级别的验证

 

开启方法级别的验证只须要配置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注解。

如今是当前方法只会使用当前方法上面配置的@Validations,不在是任何方法上配置的@Validations对全部方法都起做用了。

 

备注:

 Annotation方式校验: Struts2提供了注解的方式校验
  1) @Validation 指明这个类或者接口将使用基于注解的校验。Struts2.1中已被标识为过期。(即如今已经不须要加这个了)
  2) @Validations() 在同一个方法上要使用多个注解校验时。
  3) @SkipValidation 指定某个方法不须要校验。不然全部方法都会使用校验。也能够在检验拦截器中使用validateAnnotatedMethodOnly

 

举例:

 

/**
	 * 保存
	 * 
	 * @return
	 * @throws Exception
	 */
	@Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名称不容许为空!"),
			@RequiredStringValidator(fieldName = "brand.code", message = "品牌惟一编码不容许为空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "网址格式错误!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不容许为空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必须为零或正整数!") })
	@InputConfig(resultName = "error")
	public String save() throws Exception {
		Brand temp = brandService.getByField("code", brand.getCode());
		if (temp != null) {
			this.addActionError("保存失败!缘由:品牌代码已存在!");
			return ERROR;
		}

		temp = brandService.getByField("name", brand.getName());
		if (temp != null) {
			this.addActionError("保存失败!缘由:品牌名称已存在!");
			return ERROR;
		}

		if (logo != null) {
			// validateImageUploadRules();
			String logImage = brandService.buildLogoImg(logo, logoContentType, logoFileName);
			brand.setLogo(logImage);
		}
		brand.setDeleted(false);
		brand.setDpTransFlag("N");
		brandService.save(brand);
		redirectionUrl = "brand!list.action";
		return SUCCESS;
	}

 

  

 

三.常见的注解

注解

相应的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

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

 

详解:

举例:@Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名称不容许为空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "网址格式错误!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不容许为空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必须为零或正整数!") })

举例:

@Validations(intRangeFields =
{ @IntRangeFieldValidator(fieldName = "age", min = "6", max = "10", message = "age must be between ${min} and ${max}")}
)

 

@IntRangeFieldValidator:必须是整数并且范围在min 和max之间,包括min和max

@RequiredStringValidator:确保一个String类型的属性不是null,而且非空(非空即""),注意:若是都是提交的时候表单都是空格,也是空。

 @UrlValidator:不起做用

@RequiredFieldValidator:确保该属性不是null

相关文章
相关标签/搜索