SpringMVC 数据校验

来源:互联网 发布:php sns开源系统 编辑:程序博客网 时间:2024/05/16 02:03
JSR 303 校验框架
  • JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来
  • 是一个运行时的数据验证框架,在验证之后验证的错误信息会马上返回出来
  • 一般用于表单提交页面(如用户名必填、只能由数字字母组成等等)

JSR 303 校验框架的注解类
  • @NotNull           注解元素必须是非空
  • @Null              注解元素必须是空
  • @Digits            验证数字构成是否合法
  • @Future            验证是否在当前系统时间之后
  • @Past                 验证是否在当前系统时间之前(Future & past 都用于标注时间类型)
  • @Max                  验证值是否小于等于最大指定整数值
  • @Min                  验证值是否大于等于最小指定整数值
  • @Pattern              验证字符串是否匹配指定的正则表达式
  • @Size              验证元素大小是否在指定范围之内
  • @DecimalMax        验证值是否小于等于最大指定小数值
  • @DecimalMin        验证值是否大于等于最小指定小数值
  • AssertTrue         被注释的元素必须为True
  • AssertFalse        被注释的元素必须为False
  • 以上所有注解可以标注在方法、字段、构造函数和方法入参上,当约束被定义在地段上的时候,这个字段的值是通过字段访问策略来获取并验证的,也就是说Bean Validation的实现者会直接访问这个实例变量,而不会调用属性的getter方法,除此之外,静态字段或者属性不会被校验。

Hibernate Validator 扩展注解类
  • @Email             被注释的元素必须是电子邮箱地址
  • @Length            被注释的字符串的大小必须在指定范围内
  • @NotEmpty          被注释的元素必须是非空的
  • @NotBlank          被注释的元素必须是非空的,并且长度要大于0
  • @Range             被注释的元素必须在合适的范围内,中有两个属性 Max 和 Min

Hibernate Validator Maven 依赖
<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-validator</artifactId>
     <version>5.2.5.Final</version>
</dependency>
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.12</version>
</dependency>
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version>1.7.12</version>
</dependency>


Hibernate Validator 示例
@NotBlank(message = “用户名不能为空")
private String username;

@Email(message = “邮箱格式不正确")
private String email;

@Range(min = 18,max = 40,message = “年龄必须在18-40岁之间")
private int age;

@Length(min = 2,max = 10,message = “真实姓名长度必须在2-10之间")
private String realName;


配置和使用 Spring MVC 校验框架
  • 如何配置Spring mvc 校验框架
    • 在/WEB-INF/spring-mvc.xml中进行配置
      • <mvc:annotation-drive validator="validator”/>
  • 如何获取校验结果
    • 在Java Bean中进行设置,例:
      • public class User implements Serializable {
      •     @NotEmpty(message = "用户名不能为空")
      •     private String userName;
      •     … … 
      • }
    • 在 Controller 中配置
      • @RequestMapping("/doRegister")
      • public String doRegister(@Valid User user,BindingResult result,ModelMap map) {
      •     // 如果入参有问题,返回注册页面
      •     if (result.hasErrors()){
      •         List<FieldError> errorList = result.getFieldErrors();
      •         for (FieldError e : errorList){
      •             map.put(“ERR_”+e.getField(),e.getDefaultMessage());
      •         }
      •         return “register.jsp”;
      •     }
      •     …… 
      •     return “success.jsp”;
      • }
    • 检验结果的入参保存在BindingResult或者Errors对象中,这两个类都位于:org.springframework.validation包中
    • 需校验的表单对象和其绑定结果对象或错误对象都是成对出现的
    • Errors 接口提供了获取错误信息的方法,如 getErrorCount() 获取错误的数量,getFieldError(String field) 得到成员属性的校验错误列表
    • BindingResult 类扩展了 Errors 接口,以便可以使用 Spring 的 org.springframework.validation 对数据进行校验,同时获取绑定结果对象的信息 
  • 在 JSP 页面中显示错误
    • 使用JSTL表达式展示错误信息
  • 国际化错误信息
    • 在 class 目录下新建一个i18n的文件夹,并新建message.properties和messages_zh_CN.properties文件
    • 在 spring-mvc.xml中配置国际化信息
      • <bean id=“validator” class=“org.springframework.validation.beanvalidation.LacalValidationFactoryBean">
      •     <property name=“validationMessageSource” ref=“messageSource”/>
      • </bean>
      • <bean id=“messageSource” class=“org.springframeworl.context.support.ResourceBundleMessageSource” p:basename=“i18n/message” />
  • 自定义校验规则
    • 定义一个注解类,并使用Constraint注解标注,属性validatedBy指定校验实现类
      • @Taeget({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
      • @Retention(RUNTIME)
      • @Documented 
      • @Constraint(validatedBy = {BetweenValidator.class})
      • public @interface Between{
      •     String message() default “Between.user.age”;
      •     Class<?>[] groups() default {};
      •     Class<? extends PayLoad>[] payLoad() default {};
      •     int min;
      •     int max;
      • }
    • 定义实现类,需要集成ConstraintValidator接口,isValid方法负责校验
      • public class BetweenValidator implements ConstraintValidator<Betweed,Integer> {
      •     private int max;
      •     private int min;
      •     
      •     @Override
      •     public boolean isValid(Integer value,ConstraintValidatorContext context) {
      •         if (value == null){
      •             return false;
      •         }
      •         if (value >= min && value <= max) {
      •             return true;
      •         }
      •         return false;
      •     }
      • }
0 0
原创粉丝点击