在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 = "action") String action, Map<String, Object> model) { String resultURL = null; if (result.hasErrors()) { prepareUpdate(model, user); return USER_CREATE_URL; } return resultURL; }
(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>