经过前面几篇文章的分析, 此时此刻我们再来看SpringMVC执行请求的流程就基本不会遇到盲点了, 在整个SpringMVC
的源码分析中, 只分析了HandlerMapping、HandlerAdapter两个组件, 至于ViewResovler, 笔者决定不去分析了,
因为这个组件不太难, 如果将HandlerAdapter都拿下来了的话, 读ViewResolver的源码就会很轻松, 因为都是类似
的, 找到对应的视图解析器, 调用解析的方法进行解析, 这前提是我们返回的是一个视图名称, 如果用了
@ResponseBody注解, 那么视图解析也就没啥必要性了, 因为数据已经在ReturnValueResolver中利用消息转换器写
回到请求端了, 所以视图解析器其实是针对于我们返回了视图的情况, 有了前面的Model以及ModelAndViewContainer
知识的铺垫, 看这一块代码简直不要太轻松……….本篇文章则对SpringMVC的执行流程进行分析, 看看我们的请求
到达了Servlet后到底是如何被处理的
引入
1 | 复制代码在前面的文章中, 我们对DispatcherServlet的初始化流程进行了分析, 首先要明白的一点是, 经过这次的初始化, |
DispatcherServlet请求的处理
入口点: FrameworkServlet
1 | 复制代码protected void service(HttpServletRequest request, HttpServletResponse response) { |
processRequest: 真正处理请求的方法
- processRequest引入
1 | 复制代码protected final void processRequest(HttpServletRequest request, HttpServletResponse response) { |
- LocalContext&RequestAttributes
1 | 复制代码首先来看前三个部分, LocalContext、RequestAttributes、initContextHolders |
- resetContextHolders&publishRequestHandledEvent
1 | 复制代码在processRequest方法的finally语句中, 调用了这两个方法, resetContextHolders方法的调用就是因为此时请求 |
- doService方法
1 | 复制代码一共六个部分, 前面已经分析了五个部分, 代码都比较简单, 而第四部分doService方法才是真正用来处理请求的, 这 |
doDispatch处理请求的核心
- 大致的流程分析
1 | 复制代码在前面的文章中, 我们对HandlerMapping和HandlerAdapter进行了详细的分析, 由此可以知道, 日常工作中使用的 |
- doDispatch源码(省略了一些异常处理以及异步请求的内容)
1 | 复制代码protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
- processDispatchResult处理视图
1 | 复制代码上面的分析中, 已经将doDispatch分析完了, 有了前面文章的铺垫, 对这个方法的分析简直是太简单了, 我们还剩下 |
本文转载自: 掘金