SpringMVC工作原理(源碼分析)

Spring源碼分析

我以下呢 就模擬一個請求 從代碼上 簡單說說 SpringMVC一個請求得流程

先來個圖


當一個請求(request)過來,進入DispatcherServlet中,裏面有個方法叫 doDispatch方法 裏面包含了核心流程

源碼如下:

然後往下看:(DispatcherServlet.java)

mapperHandler是  HandlerExecutionChain (處理器調用鏈) 

HandlerExecutionChain 包含了 處理器對象 以及和處理器相關的 攔截器。 有目標方法 和 Handler


HandlerMapping 獲取HandlerExecutionChina對象 源碼的1120行(DispatcherServlet.java)。

這裏 1115行的 Handlermapping 定義了請求到處理器之間的映射   請求找到處理器 就需要用到HandlerMapping


上面的代碼執行完 後 又返回到 932行 繼續執行 

這裏將出現三種 情況:

一、當請求的url路徑不存在時(沒有對應的requestmapping註解方法)

如果發的請求的映射是空的。返回的HandlerExecutionChain  mappedHandler對象爲空表示沒有對應的映射 執行noHandlerFound方法


經過這個方法  表示沒有頁面 並且 會進入404 錯誤頁面。

二、 當請求的路徑url不存在時(沒有對應的requestmapping註解方法),applicationcontext.xml中存在以下註解時:

經過上面的配置 則 getHandler()  不是null 因爲 加上以上的配置,會調用SimpleUrlHandlerMapping 去尋找本地的靜態資源,如css js 等 但是 同樣的路徑不存在 跳轉到404頁面


三、如果存在映射,繼續執行之後的代碼:

  執行到上面這行:

HandlerAdapter(Handler適配器)

這個類 進行了 很多操作,比如表單到實體Bean的賦值,通過Binner進行了 數據的綁定。

繼續執行:954行

這裏呢 底層 調用了攔截器的 PreHandle方法,如圖:

然後繼續執行 到 代碼 959行(DispatcherServlet.java)

這裏呢就返回了一個ModelAndView,如果所示.

隨後代碼繼續執行  調用了 攔截器的 PostHandler方法 ,然後調用 ProcessDispatchResult方法,如下圖:

繼續執行

然後繼續執行 一直到 代碼的 1027行(DisPatcherServlet.java)

這裏就是已經在渲染視圖了render() 方法

這裏 通過在applicationcontext.xml中配置的視圖解析器 進行了引用 然後將頁面進行了轉發,

上面的 rd.forward 就是進行了轉發  然後整個流程就已經走完了!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章