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); }
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()方法執行。
app
從圖中能夠看出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
同獲取處理器的方法相似,Spring MVC遍歷全部HanlderAdapter,最後獲取到AnnoationMethodHandlerAdapter。
注意:<mvc:default-servlet-handler/>和<mvc:annotation-driven/>一樣會影響Adapter,AnnotationMethodHandlerAdapter會被換成RequestMappingHandlerAdapter;this
mv = ha.handle(processedRequest, response, mappedHandler.getHandler())中最重要的就是最後的一句spa
return this.invokeHandlerMethod(request, response, handler);
在invokeHandlerMethod方法中,spring MVC會找到全部@ModelAttribute方法,並提早運行這些方法,而後把這些方法的返回值放入隱含模型中,而後再執行目標方法.code