1. 程式人生 > >SpringMVC工作原理概述

SpringMVC工作原理概述

SpringMVC是當今最主流的Web MVC框架,沒有之一,要做一名合格的JavaWeb工程師,學好它勢在必行!

與Struts2原理不同,SpringMVC是通過最基礎最傳統的servlet來實現對框架原始碼的封裝以及對整個流程的控制的,而Struts2是通過過濾器來實現URL路徑與具體Action的對應關係確認的。(Struts2具體機制參看另一篇部落格連結

下圖是springMVC的原理示意圖:


SpringMVC工作流程概述:

1、客戶端向web伺服器(如tomcat)傳送一個http請求,web伺服器對http請求進行解析,解析後的URL地址如果匹配了DispatcherServlet的對映路徑(通過web.xml中的servlet-mapping配置),web容器就將請求交給DispatcherServlet處理。

2、DispatcherServlet接收到這個請求後,再對URL進行解析,得到請求資源識別符號(URI)。然後呼叫相應方法得到的HandlerMapping物件,再根據URI,呼叫這個物件的相應方法獲得Handler物件以及它對應的攔截器。(在這裡只是獲得了Handler物件,並不會操作它,在SpringMVC中,是通過HandlerAdapter對Handler進行呼叫、控制的)

3、DispatcherServlet根據得到的Handler物件,選擇一個合適的HandlerAdapter,建立其例項物件,執行攔截器中的preHandler()方法。

4、在攔截器方法中,提取請求中的資料模型,填充Handler入參,所以所有準備工作都已做好,開始執行Handler(我們寫的controller程式碼並不是能被直接執行,需要有剛才那些操作,才能轉變為Handler被執行)。

5、Handler執行完畢後返回一個ModelAndView物件給DispatcherServlet。

6、這個ModleAndView只是一個邏輯檢視,並不是真正的檢視,DispatcherServlet通過ViewResolver檢視解析器將邏輯檢視轉化為真正的檢視(通俗理解為將檢視名稱補全,如加上路徑字首,加上.jsp字尾,能指向實際的檢視)。

7、DispatcherServlet通過Model將ModelAndView中得到的處資料解析後用於渲染檢視。將得到的最終檢視通過http響應返回客戶端。

概念解析:

1、HandlerMapping 
Spring mvc 使用HandlerMapping來找到並儲存url請求和處理函式間的mapping關係。 
  
以DefaultAnnotationHandlerMapping為例來具體看HandlerMapping的作用 
  DefaultAnnotationHandlerMapping將掃描當前所有已經註冊的spring beans中的@requestmapping標註以找出url 和 handler method處理函式的關係並予以關聯。 

2、Handleradapter 
Spring MVC通過HandlerAdapter來實際呼叫處理函式。 
以AnnotationMethodHandlerAdapter為例 
DispatcherServlet中根據handlermapping找到對應的handler method後,首先檢查當前工程中註冊的所有可用的handlerAdapter,根據handlerAdapter中的supports方法找到可以使用的handlerAdapter。通過呼叫handlerAdapter中的handle方法來處理及準備handler method中的引數及annotation(這就是spring mvc如何將reqeust中的引數變成handle method中的輸入引數的地方),最終呼叫實際的handle method。


其他問題:

Spring為什麼要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
    符合面向物件中的單一職責原則,程式碼架構清晰,便於維護,最重要的是程式碼可複用性高。如HandlerAdapter可能會被用於處理多種Handler。

時序圖(轉載):