SpringMVC_JSR303数据校验

数据校验;只做前端校验是不安全的;在重要数据一定要加上后端验证;

1、JSR303数据校验如何校验

①使用JSR 303验证标准
②加入hibernate validator验证框架
③在SpringMVC配置文件中增加mvc:annotation-driven/
④需要在bean的属性上增加对应验证的注解
⑤在目标方法bean类型的前面增加@Valid注解

2、验证出错后,跳转到哪个页面
3、错误消息,如何显示,如何国际化
4、JSR 303

是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 .
JSR 303 (Java Specification Requests意思是Java 规范提案)通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证
SpringMVC_JSR303数据校验_第1张图片

5) Hibernate Validator 扩展注解

Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解
SpringMVC_JSR303数据校验_第2张图片

6、Spring MVC 数据校验
  • Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。
  • Spring 在进行数据绑定时,可同时调用校验框架完成数据校验工作。在 Spring MVC 中可直接通过注解驱动的方式进行数据校验
  • Spring 的 LocalValidatorFactroyBean 既实现了 Spring 的 Validator 接口,也实现了 JSR 303 的 Validator 接口。只要在 Spring 容器中定义了一个 LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
  • Spring 本身并没有提供 JSR303 的实现,所以必须将 JSR303 的实现者的 jar 包放到类路径下。
  • 会默认装配好一个 LocalValidatorFactoryBean,通过在处理方法的入参上标注 @Valid 注解即可让 Spring MVC 在完成数据绑定后执行数据校验的工作
  • 在已经标注了 JSR303 注解的表单/命令对象前标注一个 @Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
7、实验代码

① 添加jar包:
hibernate-validator-5.0.0.CR2\dist

  • hibernate-validator-5.0.0.CR2.jar
  • hibernate-validator-annotation-processor-5.0.0.CR2.jar

hibernate-validator-5.0.0.CR2\dist\lib\required (EL就不需要加了)

  • classmate-0.8.0.jar
  • jboss-logging-3.1.1.GA.jar
  • validation-api-1.1.0.CR1.jar

② 在验证属性上增加验证注解

public class Employee {
 
private Integer id;
 
@NotEmpty
private String lastName;
 
@Email
private String email;
//1 male, 0 female
private Integer gender;
 
private Department department;
 
//关于类型转换
@Past //被标注的日期必须是一个过去的日期
@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date birthDay ;
 
@NumberFormat(pattern="#,###,###.#")
	private double salary ;
}

③ 在SpringMVC封装对象的时候,告诉SpringMVC这个javaBean需要校验

//添加员工
/** 增加@Valid注解,验证失败会报错。
 * 严重: Servlet.service() for servlet springDispatcherServlet threw exception
java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
 */
		@RequestMapping(value="/empAdd",method=RequestMethod.POST)
		public String empAdd(@Valid Employee employee,BindingResult bindingResult){
		System.out.println("empAdd - employee="+employee);
		 
		if(bindingResult.getErrorCount() > 0 ){
		System.out.println("类型转换出错误了");
		List<FieldError> fieldErrors = bindingResult.getFieldErrors();
		for(FieldError fieldError : fieldErrors){
		System.out.println(fieldError.getField() + " - " + fieldError.getDefaultMessage());
		}
}
 
employeeDao.save(employee);
return "redirect:/empList";
}

④如何知道校验结果;
给需要校验的javaBean后面紧跟一个BindingResult。这个BindingResult就是封装前一个bean的校验结果;
⑤根据不同的校验结果决定怎么办?
⑥来到页面使用form:errors取出错误信息即可;
SpringMVC_JSR303数据校验_第3张图片
⑦ public interface BindingResult extends Errors

  • Spring MVC 是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResultErrors 类型,这两个类都位于 org.springframework.validation 包中
  • 需校验的 Bean 对象和其绑定结果对象或错误对象是成对出现的,它们之间不允许声明其他的入参
  • Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或 getFieldErrors(String field)
  • BindingResult 扩展了 Errors 接口

你可能感兴趣的:(SpringMVC)