首页 > 代码库 > Spring3.0 入门进阶(6):自定义校验器

Spring3.0 入门进阶(6):自定义校验器


在Spring 3 中,对表单提交的校验方式比较常见的有两种

(1)基于注解:对于简单的属性校验,例如,长度,非空等,可以使用Spring,或是Hibernate自带的校验注解

(2)自定义校验类:对于复杂的业务校验可以自定义校验类,该类继承自org.springframework.validation.Validator

(3)前台JS校验


增加表单校验功能大概分一下几个步骤


定义校验规则


基于注解的验证

只需要在相关的实体字段上添加校验注解即可,下面的例子基于hibernate的校验标签

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Email;

public class User extends BasePO {

  private static final long serialVersionUID = 6295814719063548261L;
  private Long id;
  @Length(min = 3, max = 20)
  private String name;
  @Length(min = 6, max = 20)
  private String pwd;
  @Email
  private String email;

  /*get set 省略*/ 

自定义校验类

创建基于org.springframework.validation.Validator的子类,实现supports,validate方法

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import com.eric.User;

public class UserValidator implements Validator {

  @Override
  public boolean supports(Class<?> clazz) {
    return User.class.equals(clazz);
  }

  @Override
  public void validate(Object target, Errors errors) {
    User user = (User) target;
    if (!user.getPwd().equals(user.getRetryPwd())) {
      errors.rejectValue("retryPwd", "error.pwd.notmath");
    }
  }

}

声明校验

基于注解的验证

注解的校验,只需要在spring的配置文件中添加如下代码段

<mvc:annotation-driven/>

自定义校验类

需要在Spring MVC Controller中添加以下方法

@InitBinder
  protected void initBinder(WebDataBinder binder) {
    binder.addValidators(new UserValidator());
  }

使用校验

不管是自定义校验,还是基于注解的校验,在使用的方式上没有区别,都需要经过下面两步

(1)在Controller 方法中添加@Valid注解

当方法的参数中使用@Valid注解时,进入该方法时会对传进来的user参数进行校验,校验的结果存储在result中,可以在方法中对result.hasErrors()的状态进行判断

@RequestMapping(USER_UPDATE_URL)
  public String action(@Valid User user, BindingResult result,
      @RequestParam(value = http://www.mamicode.com/"action") String action, Map model) {>

(2)在页面中添加错误标签

<sf:errors path="retryPwd" cssClass="error"/> 中的path指定了对应的属性路径

<div class="form-group">    <label for="password"><spring:message code="user.field.pwd" /></label>    <sf:password path="pwd" id="pwd" class="form-control" size="15"        showPassword="true" maxlength="50" />    <sf:errors path="pwd" cssClass="error" /></div><div class="form-group">    <label for="confirmpassword"><spring:message            code="user.field.repwd" /></label>    <sf:password path="retryPwd" id="retrypwd" class="form-control"        size="15" maxlength="50" showPassword="true" />    <sf:errors path="retryPwd" cssClass="error" /></div>