标签:Spring MVC
1. 数据校验框架
Spring 3.0拥有自己独立的数据校验框架,同时支持JSR 303标准的校验框架。Spring 的DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在Spring MVC中,则可直接通过注解驱动的方式进行数据校验。
Spring的org.springframework.validation是校验框架所在的包
2. JSR 303
JSR 303是Java为Bean数据合法性校验所提供的标准框架,它已经包含在Java EE 6.0中。JSR 303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
你可以通过http://jcp.org/en/jsr/detail?id=303了解JSR 303的详细内容。
【心法】: jsr 303 标准 用法: 数据前面加 注解即可
(用注解)声明式事务 (写代码)编程式事务 、编程式验证/声明式验证
3. 数据校验框架
注意:Spring本身没有提供JSR 303的实现,所以必须将JSR 303的实现者(如Hibernate Validator)的jar文件放到类路径下,Spring将自动加载并装配好JSR 303的实现者。
4. 如何使用注解驱动的校验
在已经标注了JSR 303注解的表单/命令对象前标注一个@Valid,Spring MVC框架在将请求数据绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验。
* @Valid 加上这个注解 自动应用jsr303 并且自动验证注解
参考《Spring 3.x企业应用开发实战》
5.使用校验功能时,处理方法要如何名??
*BindingResult error 校验失败 校验信息就在这个对象里取到
Spring MVC是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存在其后的入参中,这个保存校验结果的入参必须是BindingResult或Errors类型,这两个类都位于org.springframework.validation包中。
6. 校验错误信息存放在什么地方??
6.1 Spring MVC将HttpServletRequest对象数据绑定到处理方法的入参对象中(表单/命 令对象);
6.2将绑定错误信息、检验错误信息都保存到隐含模型中;
6.3本次请求的对应隐含模型数据存放到HttpServletRequest的属性列表中,暴露给视图 对象。
7. 如何对错误信息进行国际化
一个属性发生校验错误时,Spring MVC会产生一系列对应的错误码键。
如果userName的@Pattern校验规则未通过,则会在“隐含模型”中产生如下的错误键,这些错误键可以作为“国际化消息”的属性键。
8. 数据模型访问结构【原理图】
/**
* springmvc中的Model相关对象 是处理和数据相关的对象
* @ModelAttribute 重命名 参数数据
* Model传递数据到视图 <=>原理等价于 request.setAttribute
* ModelMap / Map 传递数据到视图
*
* ModelAndView 绑定数据到视图 (modelMap用于传递数据 View对象用于跳转)
*/
9. 访问数据模型
一、访问数据模型:ModelAndView(通过ModelAndView)
二、访问数据模型:@ModelAttribute
1. 使用方式一
Spring MVC将HTTP请求数据绑定到user入参中,然后再将user对象添加到数据模型中。
2. 使用方式二
三、访问数据模型:Map及Model (org.springframework.ui.Model和java.util.Map)
Spring MVC一旦发现处理方法有Map或Model类型的入参,就会将请求内在的隐 含模型对象的引用传给这些入参。
四、访问数据模型:@SessionAttributes
如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标注一个@SessionAttributes,Spring MVC会将模型中对应的属性暂存到HttpSession中:
10. 一场由@SessionAttributes引发的血案...
对入参标注@ModelAttribute(“xxx”)的处理方法,Spring MVC按如下流程处理(handle71(@ModelAttribute(“user”) User user)):
如果隐含模型拥有名为xxx的属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则到2步 。
如果xxx是会话属性,即在处理类定义处标注了@SessionAttributes("xxx"),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException异常。否则到 3。
如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象实例,再用请求消息填充该入参。
11. 如何避免@SessionAttributes引发的血案
12. 应用: 在一般情况下,用于 注册页面(进行校验 错误消息必须国际化)