SpringMVC-源碼解析

SpringMVC九大組件

SpringMVC的九大組件:
1.文件上傳解析器:private MultipartResolver multipartResolver
2.國際化解析器:private LocalResolver localResolver
3.主題解析器:private ThemeResolver themeResolver
4.Hanlder映射信息:private List<HandlerMapping> handlermappings
5.Handler適配器:private List<HandlerAdapter> handlerAdapters
6.異常解析器:private List<HandlerExceptionResolver> handlerExceptionResolvers
7.重定向解析器:private RequestToViewNameTranslator viewNameTranslator;
8.flash解析器:private FlashMapManager flashMapManager
9.視圖解析器:private List<ViewResolver> viewResolversweb

SpringMVC的全部工做都是依賴以上解析器完成的,而且這些解析器都是接口,開發人員能夠經過實現這些接口,配置本身的解析器。便於開發人員進行功能拓展.spring

組件初始化:服務器

protected void initStrategies(ApplicationContext context) {
        initMultipartResolver(context);
        initLocaleResolver(context);
        initThemeResolver(context);
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initHandlerExceptionResolvers(context);
        initRequestToViewNameTranslator(context);
        initViewResolvers(context);
        initFlashMapManager(context);
    }

SpringMVC執行步驟

1.請求發出後,SpringMvc先驗證請求是否爲靜態資源,若是爲靜態資源就交給web服務器去處理,若是不是就提交給DispatcherServlet,DispatcherServlet最後經過doDispatch()方法處理請求。
2.doDispatch先檢查文件是否爲上傳文件請求。
3.根據HandlerMapping的映射信息找處處理器(Controller)類和攔截器類。
4.若是沒找處處理器就拋出404異常,若是找處處理器類就拿到這個類的全部適配器HandleAdapter(執行方法)。
5.攔截器的preHandle方法執行。
6.適配器執行目標方法,返回一個ModelAndView。mvc

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

7.攔截器的postHandle方法執行。
8.若是出現異常則調用異常處理器處理異常不然就是用render()渲染頁面。
9.攔截器afterCompletion()方法執行。
8}DK38J3DXCD9$~NDMMCE`3.pngapp

LEPU`}]KOC3BPO5~{8Z~TX0.png

如何獲取處理器getHandler()細節

W{ZFYPYP[[3WZ__L1BSG.png
從圖中能夠看出Spring MVC遍歷了全部的HandlerMapping,在DefaultAnnoationHandlerMapping中的handlerMap尋找到了和請求地址對應的處理器。
注意:在SpringMVC配置文件中使用<mvc:default-servlet-handler/>時,會發現'DefaultAnnoationHandlerMapping'沒有了變成'SimpleSimpleUrlHandlerMapping'了,那是由於<mvc:default-servlet-handler/>的做用。此時的項目是不能處理請求的只能訪問靜態資源,由於SimpleSimpleUrlHandlerMapping默認把請求都交給Tomcat處理。此時就要加入<mvc:annotation-driven/>,<mvc:annotation-driven/>會加入了一個RequestMappingHandlerMapping負責處理請求。所以<mvc:annotation-driven/>和<mvc:default-servlet-handler/>必須一塊兒使用才行!!post

如何獲取處理器適配器getHandlerAdapter()細節

~CZ~D(PTZ$\(V62\)$F15}AKP.png
同獲取處理器的方法相似,Spring MVC遍歷全部HanlderAdapter,最後獲取到AnnoationMethodHandlerAdapter。
注意:<mvc:default-servlet-handler/>和<mvc:annotation-driven/>一樣會影響Adapter,AnnotationMethodHandlerAdapter會被換成RequestMappingHandlerAdapter;this

preHandle()細節

94$U65\(2E67$`3G[QA(FLOM.png

%OBT4UOH4HWRBYFA@YK~R9G.png

如何執行目標方法 mv=ha.handle()細節

mv = ha.handle(processedRequest, response, mappedHandler.getHandler())中最重要的就是最後的一句spa

return this.invokeHandlerMethod(request, response, handler);

FW8SXcode8RQP/codeKUUD_][9O(0Y.png
invokeHandlerMethod方法中,spring MVC會找到全部@ModelAttribute方法,並提早運行這些方法,而後把這些方法的返回值放入隱含模型中,而後再執行目標方法.code

相關文章
相關標籤/搜索