spring 容器加载

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的转发操作

posted @ 2016-03-16 18:20  kelanss  阅读(207)  评论(0编辑  收藏  举报