請求過來先遇見中央調度器(前端調度器)前端
//Determine handler for the current request; 對當前請求決定交給哪一個handler, 當前請求地址過來app
處理器執行鏈處理請求,接着咱們去找getHandler的實現this
hm是HandlerMapping對象,下圖選定位置調用HandlerMapping的getHandler()方法經過請求找到Handler,可是返回值爲HandlerExecutionChain(執行鏈)spa
這個servlet所支持的處理器映射器的集合,這裏有N個處理器映射器。hm就是指HandlerMapping ,下面的if中的代碼是指記錄日誌,日誌跟蹤。HandlerMapping處理器映射器中有N個攔截器,處理客服端請求的處理器只有一個,就是handler處理器。日誌
getHandler咱們跟進去,對象
看過來的handler是否是執行鏈,要是就把handler強轉成執行鏈,若是不是我new出一個執行鏈而且把handler給執行鏈。blog
HandlerInterceptor是處理器的攔截器。並且不是一個是多個攔截器(this.adaptedInterceptors),而後作了一個操做。若是當期攔截器,是映射用的攔截器,就把他給強轉成處理器映射器。get
而後作了一個匹配,和查找的路徑作匹配。而後加到了執行鏈攔截器中。那麼若是不是就直接用一個的參數來添加。全部能夠看出HandlerExecutionChain中只包含一個handler。包含N個攔截器。在把這個對象返回給了中央調度器。servlet
HandlerMapping總結:io
DispatcherServlet
--->doDispatcher()
---->getHandler(request):
---->HandlerExecutionChain
------> hm.getHandler(request)-----》方法體中
----->ExecutionChain executionChain = getHandlerExecutionChain(handler, request);
----->new HandlerExecutionChain(handler)
----->chain.addInterceptor(interceptor);
HandlerMapping:處理器映射器
做用:根據【請求】找到【處理器Handler】,但並非簡單的返回處理器,而是
將處理器和攔截器封裝,造成一個處理器執行鏈(HandlerExecuteChain)。
4.DispatcherServlet 拿着執行鏈去尋找對應的處理器適配器(HandlerAdapter)
爲何要引入適配器?
由於處理器(Handler)有不少種,DispatcherServlet沒辦法統一管理,因此出現了適配器。
讓適配器統一處理Handler,而DispatcherServlet統一處理適配器。
根據請求去找對應的handler