1. 程式人生 > >springmvc工作原理(無原始碼解析)

springmvc工作原理(無原始碼解析)

前言

對springmvc的工作方式一直有一些興趣,查閱了一些五花八門的資料,自己也嘗試著去看原始碼,但無奈原始碼太長,時間價效比太低,遂簡述基本的工作方式,如有錯誤,歡迎指出

SpringMvc工作原理圖

HandlerMappingæ§è¡æµç¨

各元件功能:

HandleMapping:根據URI定位Handler(即使用@RequestMapping註解的類或方法),最後以HandlerExecutionChain(包括Handler物件以及Handler物件對應的攔截器)物件的形式返回給DispatcherServlet,SpringMvc有許多HandleMapping,預設情況下,SpringMvc會使用BeanNameUrlHandlerMapping、RequestMappingHandlerMapping(5.1.0的API文件這麼寫的)

HandleAdapter:介面卡,使用了介面卡模式,DispatcherServlet會將HandleMapping返回的HandleExecutionChain傳遞給HandleAdapter,由於Handler的形參具有多種形式,而Servlet的處理方法的結構是固定的,都是以request和response為引數的方法,所以springmvc通過介面卡來用固定結構的Servlet處理方法呼叫靈活的Handler,返回ModelAndView給DispatcherServlet,SpringMvc預設裝配RequestMappingHandlerAdapter、HttpRequestHandlerAdapter 、SimpleControllerHandlerAdapter(SpringMVC 5.1.0的API文件是這麼寫的)

ViewResolver:檢視解析器,用於將ModelAndView中的邏輯檢視轉換為檢視物件

View:檢視,此時會將資料模型中的資料渲染到View中

SpringMvc工作流程

      1. 使用者向伺服器傳送請求,請求被DispatcherServlet捕獲;

      2. DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandleMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回;

      3. DispatcherServlet 根據獲得的HandlerExecutionChain,通過存放在其中的handler選擇一個合適的HandlerAdapter,如果有攔截器,則會織入攔截器的方法

       4.  HandleAdapter提取Request中的模型資料,進行相應的型別轉換,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

      資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等,使用HttpMessageConveter(負責HTTP請求引數與java物件之間的相互轉換),HttpMessageConveter只能進行檔案型別以及String型別的簡單轉換,需要進一步轉換才能成為POJO或者其他引數型別,為此,Spring提供了轉換器和格式化器

      資料格式化:對請求訊息進行資料格式化。 如將字串轉換成格式化數字或格式化日期等

      資料驗證: 驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中

      5.  Handler執行完成後,向DispatcherServlet 返回一個ModelAndView物件;

      6.  根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;

      7. ViewResolver 結合Model和View,來渲染檢視

      8. 將渲染結果返回給客戶端。

SpringMVC中有許多提前實現的HandleMapping以及HandleAdapter,我習慣使用@RequestMapping註解,在SpringMvc中對應的處理器對映與處理器介面卡為RequestMappingHandlerMapping 以及RequestMappingHandlerAdapter