Spring mvc的执行流程

详细步骤

1
2
3
4
5
6
7
8
1. 请求到达 DispatcherServlet
2. DispatcherServlet 根据 URL 查找 HandlerMapping
3. HandlerMapping 找到合适的 Controller
4. 调用 Controller 中的方法处理请求
5. Controller 返回 ModelAndView
6. DispatcherServlet 调用 ViewResolver 解析视图
7. 渲染视图并返回给客户端
8. 请求结束

DispatcherServlet 源码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
// wwb异步处理管理器
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

try {
try {
ModelAndView mv = null;
Exception dispatchException = null;

try {
// 检测是不是文件流
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
// 根据请求的url获取HandleMapping
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null) {
// 如果根据url找不到对应的HandleMapping则返回404错误
this.noHandlerFound(processedRequest, response);
return;
}

// 获取HandleMapping适配器
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
String method = request.getMethod();
boolean isGet = HttpMethod.GET.matches(method);
if (isGet || HttpMethod.HEAD.matches(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
return;
}
}

// HandlerInterceptor#preHandle 拦截器方法执行,如果返回false 则直接返回,不进行后续处理,主要用来前置处理,比如可以实现HandlerInterceptor方法,进行鉴权操作 执行顺序:正序
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}

// 执行Controller的方法,并返回ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}

this.applyDefaultViewName(processedRequest, mv);
// 执行HandlerInterceptor#postHandle方法 一般对response进行梳理 执行顺序:倒叙
mappedHandler.applyPostHandle(processedRequest, response, mv);
} catch (Exception var20) {
Exception ex = var20;
dispatchException = ex;
} catch (Throwable var21) {
Throwable err = var21;
dispatchException = new ServletException("Handler dispatch failed: " + err, err);
}

// ViewResolver解析ModelAndView
this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
} catch (Exception var22) {
Exception ex = var22;
// 执行HandlerInterceptor#afterCompletion方法 执行顺序:倒叙
this.triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
} catch (Throwable var23) {
Throwable err = var23;
// 执行HandlerInterceptor#afterCompletion方法 执行顺序:倒叙
this.triggerAfterCompletion(processedRequest, response, mappedHandler, new ServletException("Handler processing failed: " + err, err));
}

} finally {
if (asyncManager.isConcurrentHandlingStarted()) {
if (mappedHandler != null) {
// 执行HandlerInterceptor#afterCompletion方法 执行顺序:倒叙
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
} else if (multipartRequestParsed) {
// 如果是文件流则删除文件流
this.cleanupMultipart(processedRequest);
}

}
}