SpringMVC(一)--SpringMVC的初始化和流程
SpringMVC是Spring提供給WEB應用的MVC框架,MVC框架一般來說由三部分組成:
- Model:模型層,一般由java bean完成,主要是進行數據庫操作;
- View:視圖層,用於前端展示,比如jsp、html等;
- Controller:控制層,鏈接前後端,處理用戶請求,起著承前啟後的作用;
早期的MVC模式中,Model由java bean扮演,View由jsp扮演,Controller由Servlet扮演,三者組成一個三角形的MVC框架,使得前後端有了一定的分離,而且控制器和模型層的分離使得很多java代碼得以重用,但是隨著前端設備的多樣化和前端各種技術的興起,前端和後段的交互只變成json數據的交互,導致後端對於jsp的依賴減少,這就出現了Spring MVC的架構。它的最大特點是結構比較松散,在Spring MVC中能夠使用JSP、JSON、XML、PDF等各類視圖,所以它能滿足手機、PC、平板等不同設備中的WEB請求。
一、Spring MVC組件和流程
Spring MVC是基於Servlet的技術,它提供了核心類DispatcherServlet和相關的組件,圍繞這個核心類有一個完整的流程,所有的WEB請求都是沿著它所規定的流程進行,所以流程就是它最神秘也是我們所好奇的運行原理。下看一個流程圖(備註:圖片摘自《JavaEE互聯網輕量級框架整合開發-SSM框架》)
Spring MVC執行流程
從上圖中可以看出,Spring MVC就是圍繞著DispatcherServlet進行的,這個類是繼承了WEB容器所提供的Servlet類,所以當WEB容器啟動的時候,隨著Servlet的初始化,它會執行過程為:
1、首先SpringMVC會根據配置信息,得到URI和處理器之間的映射關系,即處理器映射HandlerMapping,因為處理器上還能加攔截器,從而會形成一個處理器執行鏈;
2、其次它還會根據上下文初始化視圖解析器ViewResolver;
上面兩步是初始化時的一些準備工作,當用戶發起一個請求時,首先會根據準備好的HandlerMapping找到對應的處理器Handler ,這樣就開始執處理器和攔截器組成的執行鏈,這個執行鏈的環境需要找處理器適配HandlerAdapter提供,當處理器返回模型和視圖的時候DispatcherServlet會把它們交給視圖解析器ViewResolver進行解析。需要註意的是,這一步要區分是不是邏輯視圖,如果是邏輯視圖,那麽試圖解析器會把模型渲染到視圖中,然後響應給用戶;如果不是邏輯視圖,則直接通過視圖渲染數據。
二、Spring MVC的初始化
Spring MVC的初始化主要有兩部分組成:
1??初始化Spring IOC
通過配置ContextLoderListener完成
2??初始化映射請求上下文
通過配置DispatcherServlet完成
註意??:如果沒有配置Spring IOC的初始化類ContextLoderListener,那麽DispatcherServlet在它初始化的時候會對Spring IOC進行初始化,一般來說最好在DispatcherServlet初始化之前就完成Spring IOC初始化。
下面是DispatcherServlet的設計(通過源碼可知它們的關系):
從上圖可以看出,DispatcherServlet最終是繼承由WEB容器提供的HttpServlet實現的。它裏面有以下幾個組件,這些組件就是Spring MVC的核心部分:
- MultipartResolver:文件解析器,用於支持服務器的文件上傳;
- LocaleResolver:國際化解析器,用來提供國際化功能;
- ThemeResolver:主題解析器,用來提供皮膚主題功能;
- HandlerMapping:映射URI和處理器,使控制器得以運行;
- HandlerAdapter:處理器適配器,為不同的處理器提供上下文運行環境;
- HandlerExceptionResolver:處理器異常解析器,用來解析處理器產生的異常;
- RequestToViewNameTranslator:視圖邏輯名稱轉換器,根據邏輯視圖的名稱找到具體的視圖。註意??:當處理器沒有返回邏輯視圖名時,將請求的URL自動映射為邏輯視圖名;
- ViewResolver:視圖解析器,當控制器返回後,通過試圖解析器會把邏輯視圖名進行,從而定位實際視圖;
在WEB容器啟動的時候,Spring MVC就會初始化上面的這些組件,所以我們不需要對他們進行配置就可以用了。本文先記錄以下Spring MVC的流程和初始化,下一篇文章將舉個實例說明。
SpringMVC(一)--SpringMVC的初始化和流程