springmvc原理簡單總結,配少量原始碼
阿新 • • 發佈:2019-02-19
1、請求到達DispatcherServlet,呼叫方法根據request到HandlerMapping(處理器對映器)中找到合適的處理器和攔截器並封裝成執行鏈,返回給DispatcherServlet細節:在HandlerMapping中找合適的處理器時,其實是遍歷HandlerMapping,HandlerMapping是List<HandlerMapping>集合,返回的執行鏈是HandlerExecutionChain,然後判斷這個鏈和鏈中的處理器是不是null,如果是null,則轉向404處理頁面呼叫getHandler方法獲取執行鏈程式碼
getHandler方法核心程式碼
2、DispatcherServlet拿到鏈中的處理器,然後到HandlerAdapter(處理器介面卡)中去找,找到支援的介面卡,然後返回給DispatcherServlet細節:springmvc如果沒有配置HandlerAdapter,那麼獲取到的就是預設的HandlerAdapter(HttpRequestHandlerAdapter、SimpleControllerHanlerAdapter、AnnotationHandlerAdapter),在獲取HandlerAdapter的時候,也是通過遍歷List<HandlerAdapter>集合方式DispatcherServlet中呼叫getHandlerAdapter方法獲取介面卡程式碼
getHandlerAdapter方法核心程式碼
3、處理器介面卡執行我們的處理器,並返回ModelAndView物件給DispatcherServlet細節:在執行我們的處理器之前,先執行了pre攔截器,攔截器返回true,則繼續往下執行
在執行處理器之後,執行post攔截器,處理一些ModelAndView物件裡的內容
4、DispatcherServlet呼叫ViewResolver(檢視解析器),找到對應的檢視,把資料填充進去,通過response響應給瀏覽器細節:
mappedHandler = getHandler(processedRequest, false);//獲取handler |
for (HandlerMapping hm : this.handlerMappings) { if (logger.isTraceEnabled()) { logger.trace( "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'"); } HandlerExecutionChain handler = hm.getHandler(request); if (handler != null) { return handler; } } |
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); |
for (HandlerAdapter ha : this.handlerAdapters) { if (logger.isTraceEnabled()) { logger.trace("Testing handler adapter [" + ha + "]"); } if (ha.supports(handler)) { return ha; } } |
if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } |
mappedHandler.applyPostHandle(processedRequest, response, mv); |
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); |