Spring数据校验

Spring数据校验

数据校验框架 & 访问数据模型

标签:Spring MVC

1. 数据校验框架

Spring 3.0拥有自己独立的数据校验框架,同时支持JSR 303标准的校验框架。Spring DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在Spring MVC中,则可直接通过注解驱动的方式进行数据校验。

 

Springorg.springframework.validation是校验框架所在的包

2. JSR 303

JSR 303JavaBean数据合法性校验所提供的标准框架,它已经包含在Java EE 6.0中。JSR 303通过在Bean属性上标注类似于@NotNull@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。

 

你可以通过http://jcp.org/en/jsr/detail?id=303了解JSR 303的详细内容。

 Spring数据校验_第1张图片

【心法】: jsr 303 标准  用法: 数据前面加 注解即可

(用注解)声明式事务  (写代码)编程式事务  、编程式验证/声明式验证

3. 数据校验框架

会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作。

 Spring数据校验_第2张图片

  注意:Spring本身没有提供JSR 303的实现,所以必须将JSR 303的实现者(如Hibernate Validator)的jar文件放到类路径下,Spring将自动加载并装配好JSR 303的实现者。

4. 如何使用注解驱动的校验

 Spring数据校验_第3张图片

   在已经标注了JSR 303注解的表单/命令对象前标注一个@ValidSpring MVC框架在将请求数据绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验。

 * @Valid 加上这个注解 自动应用jsr303 并且自动验证注解

参考《Spring 3.x企业应用开发实战》

5.使用校验功能时,处理方法要如何名??

 Spring数据校验_第4张图片

*BindingResult error 校验失败 校验信息就在这个对象里取到      

Spring MVC是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存在其后的入参中,这个保存校验结果的入参必须是BindingResultErrors类型,这两个类都位于org.springframework.validation包中。

6. 校验错误信息存放在什么地方??

 Spring数据校验_第5张图片

6.1 Spring MVCHttpServletRequest对象数据绑定到处理方法的入参对象中(表单/   令对象);

6.2将绑定错误信息、检验错误信息都保存到隐含模型中;

6.3本次请求的对应隐含模型数据存放到HttpServletRequest的属性列表中,暴露给视图   对象。

7. 如何对错误信息进行国际化

 一个属性发生校验错误时,Spring MVC会产生一系列对应的错误码键。

  如果userName@Pattern校验规则未通过,则会在“隐含模型”中产生如下的错误键,这些错误键可以作为“国际化消息”的属性键。

 Spring数据校验_第6张图片

8. 数据模型访问结构【原理图】

/**

 * springmvc中的Model相关对象 是处理和数据相关的对象

 * @ModelAttribute 重命名 参数数据

 * Model传递数据到视图 <=>原理等价于 request.setAttribute

 * ModelMap / Map 传递数据到视图

 *

 * ModelAndView 绑定数据到视图 (modelMap用于传递数据 View对象用于跳转)

 */

 Spring数据校验_第7张图片

9. 访问数据模型

一、访问数据模型:ModelAndView(通过ModelAndView

 Spring数据校验_第8张图片

二、访问数据模型:@ModelAttribute

1. 使用方式一

    

  Spring MVCHTTP请求数据绑定到user入参中,然后再将user对象添加到数据模型中。

 

2.   使用方式二

 Spring数据校验_第9张图片

 

 

三、访问数据模型:MapModel   org.springframework.ui.Modeljava.util.Map

 Spring数据校验_第10张图片

Spring MVC一旦发现处理方法有MapModel类型的入参,就会将请求内在的隐 含模型对象的引用传给这些入参。

四、访问数据模型:@SessionAttributes

如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标注一个@SessionAttributesSpring MVC会将模型中对应的属性暂存到HttpSession:

 Spring数据校验_第11张图片

10. 一场由@SessionAttributes引发的血案...

对入参标注@ModelAttribute(xxx)的处理方法,Spring MVC按如下流程处理(handle71(@ModelAttribute(user) User user)):

 如果隐含模型拥有名为xxx的属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则到2步 。

 如果xxx是会话属性,即在处理类定义处标注了@SessionAttributes("xxx"),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException异常。否则到 3

 如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象实例,再用请求消息填充该入参。

11. 如何避免@SessionAttributes引发的血案

 Spring数据校验_第12张图片

12. 应用: 在一般情况下,用于 注册页面(进行校验  错误消息必须国际化)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(spring)