整体总结如下:
1.确定一个key:
1).若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。
2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值.
2.在implicitModel(相当于request)中查找key对应的对象,若存在,则作为入参传入。
1).若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!
3.在implicitModel中不存在key对应的对象。
则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该主机,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。
4.若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标方法的参数。
5.SpringMVC会把key和POJO对象保存到implicitModel中,进而会保存到request域中!
@ModelAttribute用于修饰方法,在每次请求目标方法之前都会被执行一次。
每个目标方法在执行前回去request域中寻找传入参数的首字母小写的参数,上面的代码就会去找student。
这样写的话事可以自动找到的,要是request域中没有这个对象,会根据反射原理自动创建一个空的该类型的对象。
如果域中的对象和传入的参数的对象名称上无法直接关联,可以通过注释指明是request域中的哪一个对象。
这个方法可以找到request域中的stu对象,所以getStudnet可以这样写:
注意事项:
1.SpringMVC中重定向和转发不会经过视图解析器。
2.SessionAttribute只能写在类上,参数:
value:指定放入session域中的键
types:指定放入session域中的对象的字节码文件。