- 用户发送请求至前端控制器DispatcherSevrlet
- 前端控制器调用HandlerMapping处理器映射器(一般通过配置的xml、注解方式进行查找)找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispatcherServlet
- DispatcherServlet再去调用处理器适配器HandlerAdapter
- HandlerAdapter经过适配找到具体的处理器(Controller)
- controller处理具体的业务之后返回ModelAndView给HandlerAdapter给DispatcherServlet
- DispatcherServlet将ModelAndView传给视图解析器ViewResolver进行视图解析
- ViewResolver将解析得到的View返回给DispatcherServlet
- DispatcherServlet将视图进行渲染(将数据模型填充到视图中)
- DispatcherServlet响应用户
前端控制器DispatcherServlet本质是一个servlet
,拦截到用户的请求之后,DispatcherServlet
会去调用定义在其父类FrameworkServlet
中的service
方法,进而调用DispatcherServlet
中的doService
方法,进而调用DispatcherServlet
中的doDispatch
方法
上述大多数的逻辑都在 doDispatch方法中进行处理
贴上加了注释的doDispatch方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
//处理器执行链
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
//处理器映射器HandlerMapping根据request拿到处理器执行链HandlerExecutionChain(具体的执行逻辑在getHandler方法中)
//HandlerExecutionChain中有个handler参数,里面包含了具体的controller.method和interceptors等信息
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
this.noHandlerFound(processedRequest, response);
return;
}
//根据HandlerExecutionChain中的handler参数得到一个处理器适配器HandlerAdapter
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (this.logger.isDebugEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
this.logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified);
}
if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
return;
}
}
//执行拦截器中的preHandle方法
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
try {
//handle方法去适配具体的controller处理具体的业务之后返回ModelAndView给HandlerAdapter
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
} finally {
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
}
this.applyDefaultViewName(request, mv);
//执行拦截器中的postHandle方法
mappedHandler.applyPostHandle(processedRequest, response, mv);
} catch (Exception var28) {
dispatchException = var28;
}
//进行试图解析
this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
} catch (Exception var29) {
this.triggerAfterCompletion(processedRequest, response, mappedHandler, var29);
} catch (Error var30) {
this.triggerAfterCompletionWithError(processedRequest, response, mappedHandler, var30);
}
} finally {
if (asyncManager.isConcurrentHandlingStarted()) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
return;
} else {
if (multipartRequestParsed) {
this.cleanupMultipart(processedRequest);
}
}
}
}