1. 程式人生 > >SpringMVC工作流程及其核心類

SpringMVC工作流程及其核心類

工作流程

這裡寫圖片描述

  1. 瀏覽器傳送http請求給伺服器,伺服器將請求轉發給DispacterServlet。

  2. DispacterServlet根據請求資訊(包括URL、Http方法、請求報文頭和請求引數Cookie等)和HandlerMaping找到處理器介面卡HandlerAdpater。

  3. HandlerAdpater找到具體的處理器Handler。

  4. Handler呼叫Controller。

  5. Controller呼叫Model具體處理請求業務得到結果ModelAndView()物件。

  6. 將ModelAndView傳給DispacterServlet。

  7. DispacterServlet將View給ViewResolver通過名稱解析檢視的物件。

  8. 將Model物件給view用於展示。

  9. 將view返回給瀏覽器。

DispacterServlet接收伺服器傳來的請求,又分發給Controller獲得最終結果,又分發給ViewResolver解析成最終xml返回給瀏覽器,起到一個排程作用。

DispacterServlet

該類是http請求處理程式/控制器的中央排程器,例如web ui控制器或者基於http的遠端匯出器。傳送到處理程式來處理一個web請求,提供方便的對映和異常處理設施。

這個servlet 是相當靈活的:根據需求安裝相應的介面卡類就可以在任何工作流中使用,它提供以下功能,將其與其他的請求驅動SpringMVC框架進行區分:

  1. 它是基於javabeans配置機制。

  2. 它可以使用預先構建或者作為程式一部分提供的一些HandlerMapping去控制對處理物件的請求路由。預設是BeanNameUrlHandlerMapping和RequestMappingHandlerMapping。 HandlerMapping物件可以定義為servlet應用程式上下文中的bean,實現HandlerMapping介面,如果存在,則覆蓋預設的HandlerMapping。 HandlerMappings可以被賦予任何bean名稱(它們通過型別進行測試)。

  3. 它可以使用任何HandlerAdapter;這允許使用任何處理程式介面。預設介面卡分別為HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,用於Spring的HttpRequestHandler和Controller介面。預設的RequestMappingHandlerAdapter也將被註冊。 HandlerAdapter物件可以作為bean新增到應用程式上下文中,覆蓋預設的HandlerAdapter。像HandlerMappings一樣,HandlerAdapters可以被賦予任何bean名稱(它們通過型別進行測試)。

  4. 排程程式的異常解決策略可以通過HandlerExceptionResolver來指定,例如將某些異常對映到錯誤頁面。預設值為ExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver。這些HandlerExceptionResolvers可以通過應用程式上下文來覆蓋。HandlerExceptionResolver可以被賦予任何bean名稱(它們通過型別進行測試)。

  5. 其檢視解析策略可以通過ViewResolver實現來指定,將符號檢視名稱解析為View物件。預設為InternalResourceViewResolver。 ViewResolver物件可以作為應用程式上下文中的bean新增,覆蓋預設的ViewResolver。 ViewResolvers可以被賦予任何bean名稱(它們通過型別進行測試)。

  6. 如果使用者不提供檢視或檢視名稱,則配置的RequestToViewNameTranslator將將當前請求轉換為檢視名稱。相應的bean名稱為“viewNameTranslator”;預設值為DefaultRequestToViewNameTranslator。

  7. 排程員解決多部分請求的策略由MultipartResolver實現決定。包括Apache Commons FileUpload和Servlet 3的實現;典型的選擇是CommonsMultipartResolver。 MultipartResolver bean名稱為“multipartResolver”;預設為無。

  8. 其區域設定解決策略由LocaleResolver決定。開箱即用的實現通過HTTP接受頭,cookie或會話工作。 LocaleResolver bean的名稱是“localeResolver”;預設值為AcceptHeaderLocaleResolver。

  9. 其主題解決策略由ThemeResolver決定。包括固定主題和Cookie和會話儲存的實現。 ThemeResolver bean的名稱是“themeResolver”;預設是FixedThemeResolver。

注意:只有在排程程式中存在相應的HandlerMapping(用於型別級註釋)和/或HandlerAdapter(用於方法級註釋))時,才會處理@RequestMapping註釋。這是預設情況。但是,如果要定義自定義HandlerMappings或HandlerAdapter,那麼您需要確保相應的自定義RequestMappingHandlerMapping和/或RequestMappingHandlerAdapter也被定義,只要您打算使用@RequestMapping。

Web應用程式可以定義任意數量的DispatcherServlet。每個servlet將在自己的名稱空間中執行,使用對映,處理程式等載入自己的應用程式上下文。只有ContextLoaderListener載入的根應用程式上下文(如果有的話)將被共享。

HandlerMaping

公共介面HandlerMapping

由定義請求和處理程式物件之間對映的物件實現的介面。

該類可以由應用程式開發人員實現,儘管這不是必需的,因為BeanNameUrlHandlerMapping和RequestMappingHandlerMapping包含在框架中。如果在應用程式上下文中沒有註冊HandlerMapping bean,則前者是預設值。

HandlerMapping實現可以支援對映攔截器,但不必。處理程式將始終包裝在HandlerExecutionChain例項中,可選地伴隨有一些HandlerInterceptor例項。 DispatcherServlet將首先按給定的順序呼叫每個HandlerInterceptor的preHandle方法,如果所有preHandle方法返回true,最後呼叫處理程式本身。

引數化此對映的功能是此MVC框架的強大且不尋常的功能。例如,可以根據會話狀態,Cookie狀態或許多其他變數編寫自定義對映。沒有其他MVC框架似乎同樣靈活。

注意:實現可以實現Ordered介面,以便能夠指定排序順序,從而實現DispatcherServlet應用的優先順序。非有序例項被視為最低優先順序。

HandlerAdpater

公共介面HandlerAdapter

MVC框架SPI,允許引數化核心MVC工作流程。

必須為每個處理程式型別實現的介面來處理請求。該介面用於允許DispatcherServlet無限可擴充套件。 DispatcherServlet通過此介面訪問所有已安裝的處理程式,這意味著它不包含特定於任何處理程式型別的程式碼。

請注意,處理程式可以是Object型別。這是為了使來自其他框架的處理程式能夠與此框架整合而無需自定義編碼,並允許不符合任何特定Java介面的註釋驅動的處理程式物件。

此介面不適用於應用程式開發人員。它可用於想要開發自己的Web工作流程的處理程式。

注意:HandlerAdapter實現者可以實現Ordered介面,以便能夠指定由

ModelAndView

持有者在Web MVC框架中的Model和View。 請注意,這些是完全不同的。 這個類只是保持兩者使得控制器能夠以單個返回值返回模型和檢視。

表示由處理程式返回的模型和檢視,由DispatcherServlet解決。 檢視可以採用需要由ViewResolver物件解析的String檢視名稱的形式; 或者可以直接指定View物件。 該模型是一個Map,允許使用由名稱鍵入的多個物件。

ViewResolver

要通過名稱解析檢視的物件實現的介面。

檢視狀態在應用程式執行期間不會更改,因此實現可以自由快取檢視。

鼓勵實施支援國際化,即本地化檢視解決。