验证器

  输入验证是Spring处理的最重要的Web开发任务之 一。在Spring MVC中,有两种方式可以验证输入,即 利用Spring自带的验证框架,或者利用JSR 303实现。 本章将详细介绍这两种输入验证方法

一. 验证概览

  Converter和Formatter作用于field级。在MVC应用 程序中,它们将String转换或格式化成另一种Java类 型,如java.util.Date。验证器则作用于object级。它决定 某一个对象中的所有field是否均是有效的,以及是否遵 循某些规则。

  如果一个应用程序中既使用了Formatter,又有 Validator(验证器),那么,它们的事件顺序是这样 的:在调用Controller期间,将会有一个或者多个 Formatter试图将输入字符串转换成domain对象中的field 值。一旦格式化成功,验证器就会介入。

  例如,Order对象可能会有一个shippingDate属性 (其类型显然为Date),它的值绝对不可能早于今天的 日期。当调用OrderController时,DateFormatter会将字 符串转化成Date,并将它赋予Order对象的shippingDate 属性。如果转换失败,用户就会被转回到前一个表单。 如果转换成功,则会调用验证器,查看shippingDate是 否早于今天的日期。

  

二. Spring验证器

  从一开始,Spring就设计了输入验证,甚至早于 JSR 303(Java验证规范)。因此,Spring的Validation 框架至今都很普遍,尽管对于新项目,一般也建议使用 JSR 303验证器。

  为了创建Spring验证器,要实现 org.springframework.validation.Validator接口。其中有supports和validate两个方法。

 Spring的Validator接口

package org.springframework.validation;
public interface Validator {
boolean supports(Class<?> clazz);
void validate(Object target, Errors errors);
}

  如果验证器可以处理指定的Class,supports方法将 返回true。validate方法会验证目标对象,并将验证错误 填入Errors对象。

  Errors对象是org.springframework.validation.Errors接 口的一个实例。Errors对象中包含了一系列FieldError和 ObjectError对象。FieldError表示与被验证对象中的某个 属性相关的一个错误。例如,如果产品的price属性必须 为负数,并且Product对象被验证为负数,那么就需要 创建一个FieldError。例如,在欧洲出售的一本Book, 却在美国的网店上购买,那么就会出现一个 ObjectError。

  编写验证器时,不需要直接创建Error对象,因为 实例化ObjectError或FieldError会花费大量的编程精力。 这是由于ObjectError类的构造器需要4个参数, FieldError类的构造器则需要7个参数,如以下构造器签 名所示:

ObjectError(String objectName, String[] codes, Object[] argumen
ts,
String defaultMessage)
FieldError(String objectName, String field, Object rejectedValue
,
boolean bindingFailure, String[] codes, Object[] argume
nts,
String defaultMessage)

  给Errors对象添加错误的最容易的方法是:在Errors 对象上调用一个reject或者rejectValue方法。调用 reject,往FieldError中添加一个ObjectError和 rejectValue。

  下面是reject和rejectValue的部分方法重载:

void reject(String errorCode)
void reject(String errorCode, String defaultMessage)
void rejectValue(String field, String errorCode)
void rejectValue(String field, String errorCode,
String defaultMessage)

  大多数时候,只给reject或者rejectValue方法传入一 个错误码,Spring就会在属性文件中查找错误码,获得 相应的错误消息。还可以传入一个默认消息,当没有找 到指定的错误码时,就会使用默认消息。

  Errors对象中的错误消息,可以利用表单标签库的 Errors标签显示在HTML页面中。错误消息可以通过 Spring支持的国际化特性进行本地化。

三. ValidationUtils类

  org.springframework.validation.ValidationUtils类是 一个工具,有助于编写Spring验证器。不需要像下面这 样:

if (firstName == null || firstName.isEmpty()) {
errors.rejectValue("price");
}

  而是可以利用ValidationUtils类的rejectIfEmpty方 法,像下面这样:

ValidationUtils.rejectIfEmpty("price");

  或者下面的代码:

if (firstName == null || firstName.trim().isEmpty()) {
errors.rejectValue("price");
}

可以编写成:

ValidationUtils.rejectIfEmptyOrWhitespace("price");

public static void rejectIfEmpty(Errors errors, String field,
String errorCode)
public static void rejectIfEmpty(Errors errors, String field,
String errorCode, Object[] errorArgs)
public static void rejectIfEmpty(Errors errors, String field,
String errorCode, Object[] errorArgs, String defaultMes
sage)
public static void rejectIfEmpty(Errors errors, String field,
String errorCode, String defaultMessage)
public static void rejectIfEmptyOrWhitespace(Errors errors,
String field, String errorCode)
public static void rejectIfEmptyOrWhitespace(Errors errors,
String field, String errorCode, Object[] errorArgs)
public static void rejectIfEmptyOrWhitespace(Errors errors,
String field, String errorCode, Object[] errorArgs,
String defaultMessage)
public static void rejectIfEmptyOrWhitespace(Errors errors,
String field, String errorCode, String defaultMessage)

  此外,ValidationUtils还有一个invokeValidator方 法,用来调用验证器

public static void invokeValidator(Validator validator,
Object obj, Errors errors)

  

  

四.

五.  

猜你喜欢

转载自www.cnblogs.com/jiangfeilong/p/10808939.html