阅读本文需要 5 分钟
前言
一说到 Spring MVC 请求流程,大家都有一张成熟的流程图,我这里有一张是来自于 应巅 老师的
但这不够,我们要从源码的角度上来理解这个过程
打断点
根据以下两个断点的调用栈,可以明确知道一个请求经过的类和方法
- Handler(Controller) 方法执行时机
- 页面渲染时机
分析请求流程
我们知道一个请求最终会交给 DispatcherServlet 的 doDispatch 处理
tips:上一篇 DispatcherServlet继承体系 对此有描述
org.springframework.web.servlet.DispatcherServlet#doDispatch 里面其实做了 5 件事
// 1.检查是否是文件上传的请求
processedRequest = checkMultipart(request);
// 2.查询handlerMappings获取执行链
mappedHandler = getHandler(processedRequest);
// 3.查询handlerAdapters获取适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 4.适配器调用handler并返回mv
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5.跳转页面,渲染视图
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchEx);
这五行代码,正是篇首流程图的核心,后面将会对 2 ~ 5 行代码单独讲述。