web服務器在啓動時加載和解析web.xml找到SpringMVC的前段總控制器DispatcherServlet
通過DispatcherServlet加載相關的配置文件(默認是mvc-dispatcher-servlet.xml)並創建表現層的IOC容器(也就是子容器)
通過DispatchServelet 進行分發請求,調用處理器映射器HandlerMapping返回一個HandlerExecutionChain對象(一個執行鏈,這個對象中包含了Handler對象和HandlerIntercepter處理器攔截器)返回給DispatchServlet。
通過處理器適配器HandlerAdapter來找到與HandlerExcutionChain中的Handler處理器對象相同類型的Handler並返回一個ModelAndView(不論是否有異常都會返回ModelAndView)。
DispatcherServlet通過配置文件選擇對應的視圖解析器(ViewResolver)進行視圖解析返回一個View對象
DispatcherServlet通過view對象進行渲染視圖(渲染視圖的含義:通過解析視圖中的el表達式,特定標籤,特定轉換等,產生html頁面/片段或者JSON字符串甚至是圖片、pdf文檔等不同的媒體形式的過程)
最後服務器將視圖結果反饋給瀏覽器。
關鍵解析:
1.配置對象(在配置文件中註冊的對象)
1.1 DispatcherServlet
SpringMVC框架中的總控制器,主要是創建表現層的IOC容器,並將請求分發給具體的控制器的Handler,又被稱爲請求分發器
1.2 InternalResourceViewResolver
內部資源解析器 用來匹配jsp頁面(當然還有其他的這就不列舉了)
InternalResourceViewResolver介紹
它是URLBasedViewResolver的子類,所以URLBasedViewResolver支持的特性它都支持。在實際應用中 InternalResourceViewResolver也是使用的最廣泛的一個視圖解析器。
那麼InternalResourceViewResolver有什麼自己獨有的特性呢?
單從字面意思來看,我們可以把InternalResourceViewResolver解釋爲內部資源視圖解析器,
這就是InternalResourceViewResolver的一個特性。InternalResourceViewResolver會把返回的視圖名稱都解析爲InternalResourceView對象,InternalResourceView會把Controller處理器方法返回的模型屬性都存放到對應的request屬性中,
然後通過RequestDispatcher在服務器端把請求forword或重定向到目標URL。比如在InternalResourceViewResolver中定義了prefix=/WEB-INF/,suffix=.jsp,然後請求的Controller處理器方法返回的視圖名稱爲test,
那麼這個時候InternalResourceViewResolver就會把test解析爲一個InternalResourceView對象,先把返回的模型屬性都存放到對應的HttpServletRequest屬性中,然後利用RequestDispatcher在服務器端把請求forword到/WEB-INF/test.jsp。
這就是InternalResourceViewResolver一個非常重要的特性,我們都知道存放在/WEB-INF/下面的內容是不能直接通過request請求的方式請求到的,爲了安全性考慮,我們通常會把jsp文件放在WEB-INF目錄下,而InternalResourceView在服務器端跳轉的方式可以很好的解決這個問題。
下面是一個InternalResourceViewResolver的定義,根據該定義當返回的邏輯視圖名稱是test的時候,InternalResourceViewResolver會給它加上定義好的前綴和後綴,組成“/WEB-INF/test.jsp”的形式,然後把它當做一個InternalResourceView的url新建一個InternalResourceView對象返回。
2.內置對象(SpringMVC框架內部對象)
2.1 HandlerMapping(處理器映射器)
2.1.1 SimpleUrlHandlerMapping對象:主要用來匹配靜態請求(url)
2.1.2 RequestMappingHandlerMapping對象:主要用來匹配註解請求(url)
2.2 HandlerAdapter類型(處理器適配器)
2.2.1 HttpRequestHandlerAdapter匹配ResourceHttpRequestHandler對象,處理靜態資源請求;
2.2.2 RequestMappingHandlerAdapter匹配具體的Handler對象,處理註解請求
HandlerMapping:請求到處理器的映射,如果映射成功返回一個HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象;如BeanNameUrlHandlerMapping將URL與Bean名字映射,映射成功的Bean就是此處的處理器;
HandlerAdapter:HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;如SimpleControllerHandlerAdapter將對實現了Controller接口的Bean進行適配,並且調處理器的handleRequest方法進行功能處理