struts2注解方式的验证

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了

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

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

打开验证

默认拦截器堆栈“defaultStack”已经打开验证。在创建自己的拦截器堆栈一定要包括两对validationworkflow拦截器。来自struts-default.xml

<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 拦截器提供了扩展。

<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


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

原文地址:https://www.cnblogs.com/zxwBj/p/8654868.html

时间: 2024-08-02 05:02:43

struts2注解方式的验证的相关文章

Struts2 注解方式@Result传递参数给其他Action

/** * 生成订单 */ @Action(value="add", className="orderAction", results={ @Result(type="redirectAction", params={"actionName", "view", "oid", "%{oid}"}), @Result(name="input", loc

Spring MVC 数据验证——validate注解方式

1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决问题.所以本次博客教程也是基于编码方式,只是在原来的基础加上注解方式. 2.配置信息 web.xml不需要改变的 hello-servlet.xml将原来的加载方式,改为自动加入有hibernate和Spring提供的validate的默认类,配置如下: <?xml version="1.0" encoding="UTF-8"?&g

微信企业号简单的OAuth2验证接口实例(使用SpringMVC非注解方式)

目前企业号只提供了scope为"snsapi_base"的应用授权作用域,也就是不会跳转到让用户授权的页面. 之前写了使用注解方式验证并获取用户信息的实例,大家不是很理解,问题很多,现在附上简单的验证获取用户信息的实例! 微信企业号OAuth2验证接口实例(使用SpringMVC) OAuth2.0验证需要注意: 1.redirect_uri参数是授权回调地址,也就是说这个地址外网是可以访问的,所以如果使用本地映射服务器的猿们请修改为外网可以访问的地址! 2.配置可信域名,可信域名是1

Struts2表单数据验证

(一) 编程式验证 对所有方法进行验证 (1) 创建一个类继承ActionSupport 原因: 因为ActionSupport类实现了Validateable接口 查看validateable接口, 发现ActionSupport对该方法做了空实现 (2) 在创建的类中覆写AcitonSupport中的valudate()方法 public class UserAction2 extends ActionSupport implements ModelDriven<User> { priva

struts2中使用ajax验证邮箱(用户名)是否被注册

action类: package com.grace.myblog.view.action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.springframework.stereot

基于已构建S2SH项目配置全注解方式简化配置文件

如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于已构建struts2项目整合spring+hibernate 这两篇文章熟悉一下. 本文是基于以上两篇文章的基础构建的,以下给出全注解方式配置S2SH项目的参考步骤. 第一步:实体类映射数据库表,简化hibernate通过xml配置文件映射 首先我们新建实体类作为测试,包结构如图所示: 新建User到model包下,实体类字段信息如下所示: package wjt.com.test.model; import javax.pe

Spring之AOP基本概念及通过注解方式配置AOP

为什么使用AOP 传统方法 AOP前前奏 首先考虑一个问题,假设我们要设计一个计算器,有如下两个需求: - 在程序运行期间追踪正在放生的活动 - 希望计算器只能处理正数的运算 通常我们会用如下代码进行实现: 定义一个接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 实现类(

struts2+ajax实现异步验证

由于老师布置作业的需要,在添加管理员的时候,要实现验证添加的管理员的用户名是否在数据库中已经存在,然后再客户端给用户一个提示.我首先想到的就是利用ajax实现异步验证技术,由于利用的ssh框架,所以在这要对struts2和ajax进行整合,由于我还没把ajax的一些知识总结出来,所以在这也不提了,有关ajax的详细内容将会在以后的博客中写出来.现在我们就以我做的这个添加管理员,验证管理员的用户名是否存在来说一下这个struts2+ajax实现异步验证技术. 首先我们来看一下我们的form表单:

Annotation(四)——Struts2注解开发

Hibernate和Spring框架的开发前边总结了,这次看一下流行的MVC流程框架Struts2的注解开发吧.Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: [html] view plaincopyprint? <span style="font-size:18px;">  <!-- 这是包名和命名空间的声明 --> <package name