springmvc源码解析(4)--handle处理请求并返回结果视图
方法入口
处理请求之前先获取handler并作为参数传入,此处不需要拦截器,所有没有传入HandlerExecutionChain
调用 AbstractHandlerMethodAdapter中的handle方法
- 判断当前是否需要支持在同一个session中只能线性地处理请求
- 如果当前不需要对session进行同步处理,则直接对HandlerMethod进行适配
- synchronizeOnSession默认false,所以走第二个分支
下面是执行的核心方法
- 首先封装了一个webRequest,这个用于argumentResolver解析参数时使用
- 初始化WebDataBinderFactory,WebDataBinder主要用来参数绑定
- 初始化 ModelFactory,用来处理model,解析@sessionAttribute @modelAttribute 的值并放到model中
- 初始化 ServletInvocableHandlerMethod,核心类,参数绑定,和请求处理都是他来完成,首先把handlerMethod 封装为 ServletInvocableHandlerMethod,然后再设置参数解析器、返回值解析器
- 对请求参数进行处理,调用目标HandlerMethod,并且将返回值封装为一个ModelAndView对象
- 对封装的ModelAndView进行处理,主要是判断当前请求是否进行了重定向,如果进行了重定向,还会判断是否需要将FlashAttributes封装到新的请求中
对目标handler的参数进行处理,并且调用目标handler
下面主要是对request中的参数进行处理,然后进行反射调用
这个方法主要有以下三个功能
- 调用modelFactory更新model。
- 根据mavcontainer 创建modelandview。
- 如果mavcontainer是redirectAttribute类型的就将值设置到 falshmap中
总结
总的来说主要流程的就是绑定参数,执行请求,处理返回值。
参数绑定主要有如下几种类型
- request中参数, request中处理
- cookie中的参数,request中处理
- session中参数, request中处理
- falshMap中的参数, RequestMappingHandlerAdapter处理
- @sessionAttribute中的参数, ModelFactory中处理
- @modelAttributes中的参数, ModelFactory中处理