Spring技術內幕筆記(2):Spring MVC 與 Web

Spring MVC 與 Web

IoC容器與Web容器的關係

ServletContext爲IoC容器提供了宿主環境。IoC容器經過ContexLoaderListener初始化創建,ContexLoaderListener是註冊在Web容器中的監聽器,當Web容器初始化時,監聽器會收到該事件從而發起Spring容器的初始化。DispatchServlet是Spring MVC處理請求的轉發器,從而響應HTTP的請求。web

ContexLoaderListener會調用ContextLoader,ContextLoader又會建立XmlWebApplicationContext,XmlWebApplicationContext做爲默認的IoC容器,負責從默認的/WEB-INF/applicationContext.xml中加載BeanDefinition。app

ContextLoader在建立IoC容器XmlWebApplicationContext後會將其註冊入servletContext的屬性ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE中。post

DispatchServlet的功能

DispatchServlet負責兩個工做,根據web.xml初始化本身的上下文,響應http請求。url

在ContextLoader加載完成後,開始DispatchServlet的初始化。首先從ServletContext中獲取WebApplicationContext做爲雙親上下文,這裏就是XmlWebApplicationContext,因此XmlWebApplicationContext定義的Bean能夠被DispatchServlet獲取,在DispatchServlet中查找Bean時,會首先從雙親上下文中查找。獲取雙親上下文後,DispatchServlet會建立本身的上下文,而且將其註冊進ServletContext的屬性中,屬性名爲該servlet相關的,由於一個Web容器能夠有多個servlet。spa

DispatchServlet上下文的初始化後會開始建立一些請求處理策略,如LocalResolver、HandlerMappings等。例如,初始化HandlerMappings就是從IoC容器中獲取全部的HandlerMapping相關的Bean。code

HandlerMapping是對HTTP請求到controller的映射,HandlerMapping根據請求獲取一個HandlerExecutionChain,其中包含了一個handler和多個interceptor,interceptor負責功能的加強。xml

例如SimpleUrlHandlerMapping在初始化時會將url和對應handler的bean放入map中保存。當請求到達時,會從SimpleUrlHandlerMapping中查找最長匹配url的handler,包裝成HandlerExecutionChain返回。對象

DispatchServlet處理請求的過程

當請求到來,從全部的HandleMapping中依次查找到匹配的HandlerExecutionChain,多個HandleMapping是按照優先級排序的。排序

HandlerExecutionChain得到後,先對請求執行intercepter的preHandler,而後執行handler,最後再次執行intercepter的postHandler,獲得最終的ModelAndView對象。事件

最後根據ModelAndView渲染視圖並返回。

ModelAndView呈現給客戶端的過程

以JSP視圖爲例。

Step1:ModelAndView得到後,會從中獲取其對應的View,也就是根據ModelAndView指明的名稱得到對應View的Bean。

Step2:View接着將數據進行合併,而後將數據放入requst中進行暴露。

Step3:根據請求,獲取URL路徑,定位資源。如JSP文件。

Step4:將包含數據的requst轉發到目標資源路徑,由web容器負責獲取資源,而且將數據裝入JSP。最後將拼裝好的文件返回。

相關文章
相關標籤/搜索