SpringMVC源码剖析1——执行流程

SpringMVC源码剖析1——执行流程


00.SpringMVC执行流程
file:///C:/Users/WANGGA~1/AppData/Local/Temp/enhtmlclip/Image.png
01.拦截所有的请求,访问DispatcherServlet
<ignore_js_op>
02.DispatcherServlet原理是一个Servlet,只要是Servlet就走doService方法
下面是DispatcherServlet的doService方法

[Java]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
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
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    if (logger.isDebugEnabled()) {
       String resumed = WebAsyncUtils.getAsyncManager(request).hasConcurrentResult() ? " resumed" : "" ;
       logger.debug( "DispatcherServlet with name '" + getServletName() + "'" + resumed +
             " processing " + request.getMethod() + " request for [" + getRequestUri(request) + "]" );
    }
 
 
    // Keep a snapshot of the request attributes in case of an include,
    // to be able to restore the original attributes after the include.
    Map<String, Object> attributesSnapshot = null ;
    if (WebUtils.isIncludeRequest(request)) {
       attributesSnapshot = new HashMap<>();
       Enumeration<?> attrNames = request.getAttributeNames();
       while (attrNames.hasMoreElements()) {
          String attrName = (String) attrNames.nextElement();
          if ( this .cleanupAfterInclude || attrName.startsWith(DEFAULT_STRATEGIES_PREFIX)) {
             attributesSnapshot.put(attrName, request.getAttribute(attrName));
          }
       }
    }
 
 
    // Make framework objects available to handlers and view objects.
    request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
    request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this .localeResolver);
    request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this .themeResolver);
    request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
 
 
    if ( this .flashMapManager != null ) {
       FlashMap inputFlashMap = this .flashMapManager.retrieveAndUpdate(request, response);
       if (inputFlashMap != null ) {
          request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
       }
       request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
       request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this .flashMapManager);
    }
 
 
    try {
       doDispatch(request, response);
    }
    finally {
       if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
          // Restore the original attribute snapshot, in case of an include.
          if (attributesSnapshot != null ) {
             restoreAttributesAfterInclude(request, attributesSnapshot);
          }
       }
    }
}

前面都没啥用就是给request添加参数

03. doDispatch(request, response);方法
[Java]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
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
83
84
85
86
87
88
89
90
91
92
93
94
95
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null ;
    boolean multipartRequestParsed = false ;
 
 
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
 
 
    try {
       ModelAndView mv = null ;
       Exception dispatchException = null ;
 
 
       try {
          processedRequest = checkMultipart(request);
          multipartRequestParsed = (processedRequest != request);
 
 
          // Determine handler for the current request. 这段代码是用来确定调用方法的,是根据路径解析出来的
          mappedHandler = getHandler(processedRequest);
          if (mappedHandler == null ) {
             noHandlerFound(processedRequest, response);
             return ;
          }
 
 
          // Determine handler adapter for the current request.
         //确定当前请求程序的适配器 [RequestMappingHandlerAdapter也是就@Controller 的适配器
          HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
 
 
          // Process last-modified header, if supported by the handler.
          String method = request.getMethod();
          boolean isGet = "GET" .equals(method);
          if (isGet || "HEAD" .equals(method)) {
             long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
             if (logger.isDebugEnabled()) {
                logger.debug( "Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
             }
             if ( new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                return ;
             }
          }
 
 
          if (!mappedHandler.applyPreHandle(processedRequest, response)) {
             return ;
          }
 
 
          // Actually invoke the handler.  通过反射调用相应执行的方法
          mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
 
 
          if (asyncManager.isConcurrentHandlingStarted()) {
             return ;
          }
 
 
          applyDefaultViewName(processedRequest, mv);
          mappedHandler.applyPostHandle(processedRequest, response, mv);
       }
       catch (Exception ex) {
          dispatchException = ex;
       }
       catch (Throwable err) {
          // As of 4.3, we're processing Errors thrown from handler methods as well,
          // making them available for @ExceptionHandler methods and other scenarios.
          dispatchException = new NestedServletException( "Handler dispatch failed" , err);
       }
       processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    }
    catch (Exception ex) {
       triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    }
    catch (Throwable err) {
       triggerAfterCompletion(processedRequest, response, mappedHandler,
             new NestedServletException( "Handler processing failed" , err));
    }
    finally {
       if (asyncManager.isConcurrentHandlingStarted()) {
          // Instead of postHandle and afterCompletion
          if (mappedHandler != null ) {
             mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
          }
       }
       else {
          // Clean up any resources used by a multipart request.
          if (multipartRequestParsed) {
             cleanupMultipart(processedRequest);
          }
       }
    }
}

04.  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
此方法主要是调用对应的适配器,然后再通过反射执行对应方法

本来应该调用 RequestHandlerAdapter类中的方法,但是没有,根据继承的关系调用父类, 抽象类 AbstractHandlerMethodAdapter中的方法 handle( )

[Java]  纯文本查看 复制代码
?
1
2
3
4
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
       throws Exception {
    return handleInternal(request, response, (HandlerMethod) handler);
}


本类

[Java]  纯文本查看 复制代码
?
1
2
protected abstract ModelAndView handleInternal(HttpServletRequest request,HttpServletResponse response,
                                                                          HandlerMethod handlerMethod) throws Exception;

然后在 RequestHandlerAdapter中调用  handleInternal( )方法
[Java]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
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
protected ModelAndView handleInternal(HttpServletRequest request,
       HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
 
 
    ModelAndView mav;
    checkRequest(request);
 
 
    // Execute invokeHandlerMethod in synchronized block if required.
    if ( this .synchronizeOnSession) {
       HttpSession session = request.getSession( false );
       if (session != null ) {
          Object mutex = WebUtils.getSessionMutex(session);
          synchronized (mutex) {
             mav = invokeHandlerMethod(request, response, handlerMethod);
          }
       }
       else {
          // No HttpSession available -> no mutex necessary
          mav = invokeHandlerMethod(request, response, handlerMethod);
       }
    }
    else {
       // No synchronization on session demanded at all...
       mav = invokeHandlerMethod(request, response, handlerMethod);
    }
 

猜你喜欢

转载自www.cnblogs.com/zhuxiaopijingjing/p/12262949.html