SessionAttributes和ModelAttribute

* SpringMVC 确定目标方法 POJO 类型入参的过程
* 1. 取得POJO入参的 key:
*        1). 若目标方法的 POJO 类型的参数没有使用 @ModelAttribute 作为修饰, 则 key 为 POJO 类名第一个字母的小写
*        2). 若使用了 @ModelAttribute 来修饰, 则 key 为 @ModelAttribute 注解的 value 属性值.
* 2. 在 implicitModel (注意,使用ModelAttribute注解的类的返回的模型会被放到implicitModel中)中查找 key 对应的对象, 若存在, 则作为入参传入
*         1). 若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到.
* 3. 若 implicitModel 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰,
*        若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所
*        对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常. (这里注意,如果使用SessionAttributes定义的key,你没有事先放到model里面,那么任 *        何时候视图获取这个key的对象,都会抛出异常)
* 4. 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则
*      会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数
* 5. SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中.

SessionAttributes

  默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。
       如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。

参数

  1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
       2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中
    3、value:其实和names是一样的

这样在修饰的控制器类中的所有@requrestMapping的方法中放入model的key的值如果在names/value中定义了,那么这个key和对象就会被放到session域中,
如果这个key没有被放入model而取出来的话,会爆出异常。

ModelAttribute

modelsttribute修饰的方法,会在所有的requestmapping方法调用之前先执行。这个方法可以在一些预处理工作,可以向model中放入数据。

modelsttribute修饰入参,实际上就是修改了入参的id,这样就能够通过id取出model中的数据了。。

注意在controller的这个Model的体系中,id是非常重要的,不指定时,id就是类名首字母小写

原文地址:https://www.cnblogs.com/Coder-Pig/p/7381175.html