java培训之JSR303数据校验

发布时间:2021年03月22日作者:atguigu浏览次数:964

JSR303数据校验

1 如何校验

1) 使用JSR 303验证标准

2) 加入hibernate validator验证框架

3) 在SpringMVC配置文件中增加<mvc:annotation-driven/>

4) 需要在bean的属性上增加对应验证的注解

5) 在目标方法bean类型的前面增加@Valid注解 

2 JSR 303

是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 .

 JSR 303 (Java Specification Requests意思是Java 规范提案)通过 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean进行验证。

java培训

 3 Hibernate Validator 扩展注解

Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解

java培训

4 Spring MVC 数据校验

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

5 实验代码

  • 添加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 ;

}

  • 增加

//添加员工

/** 增加@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”;

}

  • 后台打印错误消息

java培训

  • 前台打印错误消息

java培训

  • 测试验证,解决EL表达式错误

拷贝hibernate-validator-5.0.0.CR2\dist\lib\required目录下的

el-api-2.2.jar、javax.el-2.2.4.jar、javax.el-api-2.2.4.jar

三个包到Tomcat/lib目录下,将原来的el-api.jar删除。重启tomcat6 

  • 如果希望验证失败,回到添加页面

@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());

}

map.put(“deptList”,departmentDao.getDepartments());

return “add”; //   /WEB-INF/views/add.jsp

}

employeeDao.save(employee);

return “redirect:/empList”;

}

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

java培训

想要了解跟多关于java培训课程内容欢迎关注尚硅谷java培训,尚硅谷除了这些技术文章外还有免费的高质量java培训课程视频供广大学员下载学习。          

 


上一篇:
下一篇:
相关课程

java培训 大数据培训 前端培训

关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园2号楼3层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦3层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)

西安市雁塔区和发智能大厦B座3层(西安校区)

成都市成华区北辰星拱青创园综合楼3层(成都校区)