SpringMVC执行流程 - 分析部分
程序员文章站
2022-05-20 14:27:13
...
流程
DispatcherServlet伪源码
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1. 找到控制器以及拦截器的一个执行链对象 - 寻找自己的笔记本
HandlerExecutionChain mappedHandler = getHandler(processedRequest);
// 2. 控制器对应的适配器 - 寻找笔记本的电源线
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 使用HandlerExecutionChain里面的拦截器preHandle,获取请求信息
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 4. 通过适配器,控制器方法被执行,并返回 ModelAndView对象(视图地址、数据),如果控制器返回值不是ModelAndView类型,则返回null
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5. 默认,通过@RequestMapping的地址赋值给ModelAndView.setName()这个视图地址,如果形参中有ModelAndView且设置了,则使用形参设置的。
applyDefaultViewName(processedRequest, mv);
//6. 执行拦截器的 PostHandle的方法, 获取请求信息
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
}
finally {
if (asyncManager.isConcurrentHandlingStarted()) {
// 7. 运行执行链中的拦截器的 afterCompletion 获取请求信息
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
}
}
}
1. 查找访问路径指定的控制器方法、以及拦截器
2. 查找合适的HandlerExecutionChain执行链适配器Adapter
3. 运行执行链的拦截器
4. 运行控制器并返回ModelAndView对象
ModelAndView必须要控制器的返回值有才行,没有则null
上一篇: 唐憎的信