SpringMVC执行流程(包含步骤解析)
1.用户发送请求来到DispatcherServlet前端控制器
2.前端控制器接受请求并调用HandlerMaping处理器映射器
3.DispatcherServlet通过HandlerMaping处理器映射器获取到HandlerAdapter处理器适配器(生成执行链–>拦截器和适配器对象)
4.HandlerAdapter处理器适配器生成拦截链(拦截器和适配器对象)
5.HandlerAdapter处理器适配器调用所对应具体控制器方法controller
6.控制器方法controller执行完成返回ModelAndView
7.HandlerAdapter处理器适配器将ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView交给ViewResolver视图解析器
9.ViewResolver视图解析器解析后返回具体的View
10.DispatcherServlet根据View进行填充数据 以及 视图渲染
11.DispatcherServlet响应用户
逐步解析
// 前端控制器,springmvc最核心的类
public class DispatcherServlet extends FrameworkServlet {
//前端控制器最核心的方法,这个是负责处理请求的,一次请求,调用一次 doDispatch 方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
//根据请求获取执行链对象(把拦截器和处理器串起来了)
HandlerExecutionChain mappedHandler = getHandler(request);
//根据处理器获取处理器适配器对象
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//执行改请求对应的所有拦截器的 preHandle 方法
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
//处理器适配器调用 处理器方法 返回ModelAndView对象
//在这里进行数据绑定,实际上调用处理器方法之前要给处理器方法传参
//这个参数要经过复杂的数据绑定过程(将前端提交的表单数据,转化为POJO对象)
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//执行该请求对应的所有拦截器的 post Handle 方法
mappedHandler.applyPostHandle(processedRequest, response, mv);
//处理分发结果(本质上就是响应结果到浏览器)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
//处理分发结果
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
@Nullable Exception exception) throws Exception {
//渲染页面
render(mv, request, response);
//执行该请求所对应的所有拦截器的 afterCompletion方法
mappedHandler.triggerAfterCompletion(request, response, null);
}
//渲染页面
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
//通过视图解析器进行解析,返回视图View对象
View view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
//调用视图对象渲染方法(完成响应)
view.render(mv.getModelInternal(), request, response);
}
//解析视图名称
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception {
//视图解析器
ViewResolver viewResolver;
//通过视图解析器返回视图对象View
View view = viewResolver.resolveViewName(viewName, locale);
}
}