本系列文章的上一篇 : Spring MVC : 控制器方法处理请求的过程分析 - 0. 概述
控制器方法的执行过程不仅仅是调用目标控制器方法,该过程也包含请求参数的获取,验证和格式转换,目标方法的执行,还有控制器方法返回值的处理等相关工作,为了记录该过程中各种执行信息,Spring MVC
设计了ModelAndViewContainer
类型来跟踪。事实上,控制器方法执行之前,RequestMappingHandlerAdapter
会先准备这样一个对象供执行过程使用。实际上,这段ModelAndViewContainer
对象准备的逻辑我们已经在本系列上一篇文章中提到过,不过为了强化理解这一小步骤,本文单独对其进行介绍。这段代码如下 :
// RequestMappingHandlerAdapter#invokeHandlerMethod 代码片段
// ...
// ModelAndViewContainer 是一个调用目标控制器方法过程中,记录参数解析,返回值处理的一些
// 决策信息的一个容器类型/持有器类型,这里准备出这样一个对象,供控制器方法调用过程中使用
ModelAndViewContainer mavContainer = new ModelAndViewContainer();
// 将请求中可能存在的 FlashMap 属性添加到 mavContainer
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
// 1. 获取所有 @SessionAttributes 属性到 mavContainer
// 2. 执行所有 @ModelAttribute 方法
// 3. 找到所有使用了注解 @ModelAttribute 并且也属于 @SessionAttributes 列表的
// 参数将其添加到 mavContainer
modelFactory.initModel(webRequest, mavContainer, invocableMethod);
// 设置重定向时如果 RedirectAttributes 属性未设置,是否要使用缺省 Model,
// 缺省值为 false, 表示即使重定向时 RedirectAttributes 属性未设置,也不要使用缺省 Model
mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
// ...
这段代码主要任务如下 :
- 创建工具对象
ModelAndViewContainer mavContainer
; - 使用以下信息初始化
mavContainer
中的数据模型;- 请求中的
FlashMap
属性; - 请求中属于@SessionAttributes`列表的属性;
- 控制器方法中使用了注解
@ModelAttribute
的方法产生的并且也属于@SessionAttributes
列表的属性;
- 请求中的
- 设置工作标志属性
ignoreDefaultModelOnRedirect
,缺省情况下,该属性设置为false
,表示即使重定向时
RedirectAttributes
属性未设置,也不要使用缺省数据模型;
准备好ModelAndViewContainer
对象之后,RequestMappingHandlerAdapter
就准备调用目标控制器方法了,该ModelAndViewContainer
对象就是用于记录执行过程中的各种决定信息的,这些执行决定信息最终用于生成调用者用于解析和渲染视图所需的ModelAndView
对象。
本系列文章链接合集 :