springboot源码分析:ModelAndViewContainer

Scroll Down

1、ModelAndViewContainer介绍

ModelAndViewContainer做为记录Model和View的关联信息,这种关联信息主要是被HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler两个类在Controller类接受请求的时候被记录。
类的字段和方法如下所示:
image.png

(1)、ModelAndViewContainer的字段

// 是否在重定向之后忽略Model信息,同样也会影响URL的?后面的数据。
// 跳转模式下如果没有设置redirectModel 是否使用defaultModel,缺省为false
private boolean ignoreDefaultModelOnRedirect = false;

// 容器中的view属性 字符串视图名称, 或者视图对象自身
@Nullable
private Object view;

// 缺省数据模型(一般指非跳转模式下的数据模型)
private final ModelMap defaultModel = new BindingAwareModelMap();

// 针对跳转模式的数据模型
@Nullable
private ModelMap redirectModel;

// 当前模式是否是跳转模式redirect
private boolean redirectModelScenario = false;

// 将要写入到响应的状态字
@Nullable
private HttpStatus status;

// 记录通过注解 @ModelAttribute(binding=true/false) 设置为不要绑定的属性的名称
private final Set<String> noBinding = new HashSet<>(4);

 // 用于记录程序化设置的禁止绑定的属性的集合
private final Set<String> bindingDisabled = new HashSet<>(4);

// 记录当前会话的状态,用于沟通协调会话处理
private final SessionStatus sessionStatus = new SimpleSessionStatus();

// 标记请求是否已经被处理完,如果请求已经被处理完,调用者无需再做后续处理工作:视图解析和渲染。
private boolean requestHandled = false;

(2)、ModelAndViewContainer的工作原理

ModelAndViewContainer中维护了关于Model和View的一组关系,其中Model代表页面的数据,是一个Map结构。而View则代表着一个页面的名称。SpringMVC在解析器工作的时候会操作ModelAndViewContainer用于记录一些操作信息,比如该ModelAndViewContainer是否被处理完成,如果处理完成那么后续在处理视图的时候会直接跳过。另外还会设置视图名称以及视图内的一组数据等等。