Spring MVC : 控制器方法处理请求的过程分析 - 1. 执行信息记录对象ModelAndViewContainer的准备

本文深入剖析SpringMVC框架中控制器方法的执行过程,包括请求参数处理、控制器方法调用及返回值处理等关键步骤。特别介绍了ModelAndViewContainer的作用及其在执行过程中的初始化细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章的上一篇 : 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);
            
          // ...  

这段代码主要任务如下 :

  1. 创建工具对象ModelAndViewContainer mavContainer;
  2. 使用以下信息初始化mavContainer中的数据模型;
    1. 请求中的FlashMap属性;
    2. 请求中属于@SessionAttributes`列表的属性;
    3. 控制器方法中使用了注解@ModelAttribute的方法产生的并且也属于@SessionAttributes列表的属性;
  3. 设置工作标志属性ignoreDefaultModelOnRedirect,缺省情况下,该属性设置为false,表示即使重定向时
    RedirectAttributes属性未设置,也不要使用缺省数据模型;

准备好ModelAndViewContainer对象之后,RequestMappingHandlerAdapter就准备调用目标控制器方法了,该ModelAndViewContainer对象就是用于记录执行过程中的各种决定信息的,这些执行决定信息最终用于生成调用者用于解析和渲染视图所需的ModelAndView对象。

本系列文章链接合集 :

  1. 概述
  2. 执行信息记录对象ModelAndViewContainer的准备
  3. 请求参数的获取
  4. 控制器方法参数值绑定 HandlerMethodArgumentResolver
  5. 控制器方法参数值的验证 MethodValidationInterceptor
  6. 调用控制器方法本身
  7. 控制器方法返回值处理
  8. 包装返回结果 : 从ModelAndViewContainer对象构造ModelAndView对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值