Spring4.0拥有自己独立的数据校验框架,同时支持JSR 303标准的校验框架,Spring在进行数据绑定的时候,可同时调用校验框架完成数据校验工作,在SpringMvc中,可直接通过注解驱动的方式进行数据校验。
Spring的LocalValidatorFactoryBean既实现了Spring的Validator接口,也实现了JSR 303的Validator接口,只要在Spring容器里定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的bean中,Spring本身并没有提供JSR 303的实现,所以必须将JSR 303的jar包放到类路径下。
<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参前面标注@Valid注解即可让SpringMvc在完成数据绑定之后执行数据校验的工作。
package com.seven.demos; import com.seven.domain.Employee; import org.springframework.stereotype.Controller; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.RequestMapping; import javax.validation.Valid; /** * Created by hu on 2016/4/4. */ @RequestMapping("/SpringMvcTest1") @Controller public class SpringMvcTest1 { /* * 在目标方法中获取校验结果 * 在表单/命令对象的属性中标注校验注解,在处理方法对应的入参前添加@Valid,SpringMvc就会实施校验 * 并将校验结果保存在校验入参对象之后的BindingResult或Error入参中。 * 常用的方法: * FieldError getFieldError(String field) * List<FieldError> getFieldErrors() * Object getFieldValue(String field) * int getErrorCount() * */ @RequestMapping("/save") public String save(@Valid Employee employee,Errors errors){ System.out.println("save:"+employee); if (errors.getErrorCount()>0){ System.out.println("出错了!"); for(FieldError error:errors.getFieldErrors()){ System.out.println(error.getField()+":"+error.getDefaultMessage()); } //出错了,重新返回输入页面 return "input"; } //没有出错,就转到正确的页面 return "success"; } }
SpringMvc除了会将表单/命令对象的校验结果保存在对应的BindingResult或Error对象中外,还会将所有校验结果保存到"隐含模型",即使处理方法的签名中没有对应与表单/命令对象的结果入参,校验结果也会保存在"隐含模型"中。隐含模型中的所有数据最终都是通过HttpServletRequest的属性列表暴露给JSP视图对象,因此在JSP中可以获取错误信息。