springmvc源码解析(4)--handle处理请求并返回结果视图

方法入口

处理请求之前先获取handler并作为参数传入,此处不需要拦截器,所有没有传入HandlerExecutionChain

springmvc源码解析(4)--handle处理请求并返回结果视图

调用 AbstractHandlerMethodAdapter中的handle方法

springmvc源码解析(4)--handle处理请求并返回结果视图

  1. 判断当前是否需要支持在同一个session中只能线性地处理请求
  2. 如果当前不需要对session进行同步处理,则直接对HandlerMethod进行适配
  3. synchronizeOnSession默认false,所以走第二个分支

springmvc源码解析(4)--handle处理请求并返回结果视图

下面是执行的核心方法

  1. 首先封装了一个webRequest,这个用于argumentResolver解析参数时使用
  2. 初始化WebDataBinderFactory,WebDataBinder主要用来参数绑定
  3. 初始化 ModelFactory,用来处理model,解析@sessionAttribute @modelAttribute 的值并放到model中
  4. 初始化 ServletInvocableHandlerMethod,核心类,参数绑定,和请求处理都是他来完成,首先把handlerMethod 封装为 ServletInvocableHandlerMethod,然后再设置参数解析器、返回值解析器
  5. 对请求参数进行处理,调用目标HandlerMethod,并且将返回值封装为一个ModelAndView对象
  6. 对封装的ModelAndView进行处理,主要是判断当前请求是否进行了重定向,如果进行了重定向,还会判断是否需要将FlashAttributes封装到新的请求中

springmvc源码解析(4)--handle处理请求并返回结果视图

对目标handler的参数进行处理,并且调用目标handler

springmvc源码解析(4)--handle处理请求并返回结果视图

下面主要是对request中的参数进行处理,然后进行反射调用

springmvc源码解析(4)--handle处理请求并返回结果视图
springmvc源码解析(4)--handle处理请求并返回结果视图

这个方法主要有以下三个功能

  1. 调用modelFactory更新model。
  2. 根据mavcontainer 创建modelandview。
  3. 如果mavcontainer是redirectAttribute类型的就将值设置到 falshmap中

springmvc源码解析(4)--handle处理请求并返回结果视图

总结

总的来说主要流程的就是绑定参数,执行请求,处理返回值。
参数绑定主要有如下几种类型

  1. request中参数, request中处理
  2. cookie中的参数,request中处理
  3. session中参数, request中处理
  4. falshMap中的参数, RequestMappingHandlerAdapter处理
  5. @sessionAttribute中的参数, ModelFactory中处理
  6. @modelAttributes中的参数, ModelFactory中处理