Spring MVC 会把ModeAndView 的 model 中数据放入到request域对象中。
在jsp页面,请求页面获得的值
${requestScope.names}
目标方法可以添加map类型的数据。
@SessionAttributes()
请求域 requestScope
会话域 sessionScope
@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是value属性值),还可以通过模型属性的对象类型指定那些模型属性需要放到会话中(实际上使用的是types属性值)。
注意:该注解只能放在类的上面,而不能修饰方法。
有@ModelAttribute 标记的方法,会在每个目标方法执行之前被Spring MVC 调用。
(链接例子:关于回显功能的部分显示值,对于未赋值的新建对象属性,其值不是为空的,而是有正确值的,比如回显用户的一些信息,但是密码是不能回显示出来的。)
执行流程:
1. 执行@ModelAttribute 注解修饰的方法: 从数据库中取出对象,把对象放入到了Map中,键为:user
2.SpringMVC 从Map中取出User对象,并把表单的请求参数赋给该User对象的对应属性。
3.SpringMVC 把上述对象传入目标方法的参数。
注意:在@ModelAttribute 修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致。
源码分析流程:
1. 调用@ModelAttribute 注解修饰的方法。实际上把@ModelAttribute 方法中Map中的数据放在了implicitModel 中。
2. 解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder 对象的target 属性
1).创建WebDataBinder 对象:
--> 确定objectName 属性: 若传入的attrName 属性值为“”,则objectName 为类名第一个字母小写。
注意: attrName .若目标方法的POJO属性使用了@ModelAttribute 来修饰,则attrName值即为@ModelAttribute的value属性值
--> 确定target属性:
> 在implicitModel中查找attrName 对应的属性值,若存在,ok
> ***若不存在:则验证当前Handler是否使用了@SessionAttribute 进行修饰,若使用了,则尝试从session 中获取attrName所对应的属性值,若session中没有对应的属性值,则抛出了异常。
> 若Handler 没有使用@SessionAttributes 进行修饰,或@SessionAttributes中没有使用value值指定的key 和attrName 相匹配,则通过反射创建了POJO对象。
2) . SpringMVC 把表单的请求参数赋给了WebDataBinder 的target 对应的属性值。
3) . ** SpringMVC 会把WebDataBinder 的attrName 和 target给到implicitModel 。进而传到request域对象中。
4 ). 把WebDataBinder 的target 作为参数传递给目标方法的入参。
2.@ModelAttribute 注解也可以来修饰目标POJO类型入参,其value属性值有如下作用:
1) .SpringMVC 会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中。
2) . SpringMVC 会一value为key,POJO类型的对象为value,存入到request中。
key值默认为类名的首字母小写。也可以用@ModelAttribute 类指定key值。
视图 视图解析器
--> 程序员可以选用一种视图解析器或混用多种视图解析器。
--> 每个视图解析器都实现了Ordered接口并开放出一个order属性,可以通过order属性指定解析器的优先顺序,order越小优先级越高。
--> SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。
InternalResourceView
把JSTL标签放到当前类路径下,这时解析的view就会变成JstlView。
配置直接转发的页面 ,可以直接响应转发页面,而无需使用Handler方法。
在实际开发中通常都需要配置mvc: annotation-driven
配置视图 BeanNameViewResolver 解析器:使用视图的名字来解析视图。
通过order属性来定义视图解析器的优先级,order值越小,优先级越高。
--> 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。
--> 如果返回的字符串中带有forward: 或 redirect: 前缀时,SpringMVC会对他们进行特殊处理:将forward: 和redirect:当成指示符,其后的字符串作为URL来处理
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转 发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
-- redirect:success.jsp :会完成一个到success.jsp的重定向的操作。
-- forward:success.jsp :会完成一个到success.jsp的转发操作