浏览器发送请求至中央调度器 DispatcherServlet.
中央调度器 DispatcherServlet 收到请求后,首先对请求进行了一个简单判断,判断其为简单请求,还是Multipart 请求。然后中央调度器遍历每一个处理器映射器HandlerMapping,将请求交给每一个处理器映射器进行匹配。
处理器映射器 HandlerMapping 接收到中央调度器传递来的请求后,对请求进行解析。
根据解析结果,找到与请求相对应的处理器对象,并将其包装为处理器执行链 HandlerExecutionChain 对象,返回给中央调度器。
所以处理器映射器顾名思义,就是将请求映射为处理器。
由于处理器的种类不只一种,不同的处理器需要不同的处理器适配器 HandlerAdapter 来执行。所以中央调度器在接收到处理器映射器 HandlerMapping 发送来的处理器执行链对象 HandlerExecutionChain 后,根据处理器执行链中的处理器,查找到与之相应的处理器适配器对象 HandlerAdapter。
当然,此时中央调度器除了找到相应的处理器适配器外,还做了一个工作:执行处理器执行链中的拦截器前端方法。
中央调度器根据处理器执行链中的处理器找到相应的处理器适配器,并在执行完处理器 执行链中的拦截器前端方法后,立即调用处理器适配器,让其执行处理器。
处理器适配器执行处理器后,处理器将 ModelAndView 返回给处理器适配器。
处理器适配器在接收到处理器返回的 ModelAndView 后,直接将 ModelAndView 返回给中央调度器。
中央调度器在接收到处理器适配器发送来的 ModelAndView 后,并不是将其作为最终的调度结果,而是首先调用执行处理器执行链中的拦截器后端方法。因为中央处理器将ModelAndView 对象传递给了拦截器的后端方法,使后端方法可以修改 ModelAndView。
处理器执行链的拦截器后端方法执行完毕后,形成最终的调度结果,所以中央调度器马上进行调度结果的处理,对处理结果 ModelAndView 进行渲染。而这个渲染的过程,其实是中央调度器遍历所有视图解析器,并根据不同的视图类型由相应的视图解析器形成相应的视图对象的过程。
视图解析器的工作很简单,将视图名称与响应目标定位对象进行绑定,形成视图对象返回给中央调度器。
在找到相应的视图对象后,中央处理器调用视图对象的渲染方法,真正对视图进行渲染。
这个渲染主要做了三样工作:合并数据 Model;结合视图对象中的响应目标定位对象,准备响应对象 Response;结合合并的数据 Model 与形成的 Response 对象,形成最终的响应视图。
在形成最终的响应视图后,中央调度器执行了收尾工作:执行处理器执行链拦截器的afterCompletion()方法。由 afterCompletion()方法发出对请求的最终响应。
浏览器接收到由服务端发来的最终的响应