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 就是進行了轉發 然後整個流程就已經走完了!!!