springmvc工作原理及原始碼分析

荊棘_747發表於2018-12-20

一、JavaEE體系結構

JavaEE體系結構

二、mvc 設計模式|思想

mvc設計思想

Model 模型層  (javaBean元件 = 領域模型(javaBean) + 業務層 + 持久層)

View 檢視層( html、jsp…)

Controller 控制層(委託模型層進行資料處理)
複製程式碼

三、springmvc簡介

springmvc是一個web層mvc框架,類似struts2。
複製程式碼

四、springmvc和spring之間關係

spring

springmvc是spring的部分,其實就是spring在原有基礎上,又提供了web應用的mvc模組。
複製程式碼

五、sprigmvc和struts2的比較

實現機制:

struts2是基於過濾器實現的。

springmvc是基於servlet實現的。

執行速度:

因為過濾器底層是servlet,所以springmvc的執行速度會稍微比structs2快。

struts2是多例的           

springmvc單例的    

引數封裝:

struts2引數封裝是基於屬性進行封裝。

springmvc是基於方法封裝。顆粒度更細。 
複製程式碼

六、springmvc的工作原理圖

springmvc工作原理圖

七、springmvc具體流程步驟

⑴ 使用者傳送請求至DispatcherServlet。

⑵ DispatcherServlet收到請求呼叫HandlerMapping查詢具體的Handler。

⑶ HandlerMapping找到具體的處理器(具體配置的是哪個處理器的實現類),生成處理器物件及處理器攔截器(HandlerExcutorChain包含了Handler以及攔截器集合)返回給DispatcherServlet。

⑷ DispatcherServlet接收到HandlerMapping返回的HandlerExcutorChain後,呼叫HandlerAdapter請求執行具體的Handler(Controller)。

⑸ HandlerAdapter經過適配呼叫具體的Handler(Controller即後端控制器)。

⑹ Controller執行完成返回ModelAndView(其中包含邏輯檢視和資料)給HandlerAdaptor。

⑺ HandlerAdaptor再將ModelAndView返回給DispatcherServlet。

⑻ DispatcherServlet請求檢視解析器ViewReslover解析ModelAndView。

⑼ ViewReslover解析後返回具體View(物理檢視)到DispatcherServlet。

⑽ DispatcherServlet請求渲染檢視(即將模型資料填充至檢視中) 根據View進行渲染檢視。

⑾ 將渲染後的檢視返回給DispatcherServlet。

⑿ DispatcherServlet將響應結果返回給使用者。
複製程式碼

八、springmvc核心元件說明

(1)前端控制器DispatcherServlet(配置即可)

功能:中央處理器,接收請求,自己不做任何處理,而是將請求傳送給其他元件進行處理。DispatcherServlet 是整個流程的控制中心。

(2)處理器對映器HandlerMapping(配置即可)

功能:根據DispatcherServlet傳送的url請求路徑查詢Handler

常見的處理器對映器:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping,

ControllerClassNameHandlerMapping,DefaultAnnotationHandlerMapping(不建議使用)

(3)處理器介面卡HandlerAdapter(配置即可)

功能:按照特定規則(HandlerAdapter要求的規則)去執行Handler。

通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件多個介面卡對更多型別的處理器進行執行。

常見的處理器介面卡:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter

(4)處理器Handler即Controller(程式猿編寫)

功能:編寫Handler時按照HandlerAdapter的要求去做,這樣介面卡才可以去正確執行Handler。

(5)檢視解析器ViewReslover(配置即可)

功能:進行檢視解析,根據邏輯檢視名解析成真正的檢視。

ViewResolver負責將處理結果生成View檢視,ViewResolver首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。

springmvc框架提供了多種View檢視型別,如:jstlView、freemarkerView、pdfView...

(6)檢視View(程式猿編寫)

View是一個介面,實現類支援不同的View型別(jsp、freemarker、pdf...)
複製程式碼

九、springmvc入門案例

  • 建立一個maven工程
    maven工程
  • 配置pom.xml

引入相關依賴:spring的基本包、springmvc需要的spring-webmvc,日誌相關的slf4j-log4j12,jsp相關的jstl、servlet-api、jsp-api。

pom.xml

  • 配置web.xml

因為DispatcherServlet本身就是一個Servlet,所以需要在web.xml配置。

web.xml

  • 配置springmvc.xml

一、使用預設載入springmvc配置檔案的方式,必須按照以下規範:

①命名規則:-servlet.xml ====> springmvc-servlet.xml

②路徑規則:-servlet.xml必須放在WEB-INF下邊

二、如果要不按照預設載入位置,則需要在web.xml中通過標籤來指定springmvc配置檔案的載入路徑,如上圖所示。

springmvc.xml

  • 自定義Controller(處理器)

將自定義的 Controller 處理器配置到 spring 容器中交由 spring 容器來管理,因為這裡的 springmvc.xml 配置檔案中處理器對映器配置的是 BeanNameUrlHandlerMapping ,根據名字可知這個處理器對映器是根據 bean (自定義Controller) 的 name 屬性值url去尋找執行類 Handler(Controller) , 所以bean的name屬性值即是要和使用者傳送的請求路徑匹配的 url 。

MyController.java

  • 定義檢視頁面

根據檢視解析路徑:WEB-INF/jsps/index.jsp

inde.jsp

  • 根據程式碼分析springmvc執行流程

springmvc程式碼執行流程

  • 處理器對映器(配置多個處理器對映器可以共存)
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
複製程式碼

功能:根據bean(自定義Controller)的name屬性的url去尋找執行類Controller。

  • 處理器介面卡(配置多個處理器介面卡可以共存)
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
複製程式碼

功能:自定義的處理器(Controller)實現了Controller介面時,介面卡就會執行Controller的具體方法。

  • 處理器介面卡原始碼SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter原始碼分析
SimpleControllerHandlerAdapter會自動判斷自定義的處理器(Controller)是否實現了Controller介面,如果是,它將會自動呼叫處理器的handleRequest方法。

Controller介面中有一個方法叫handleRequest,也就是處理器方法。

因此,自定義的Controller要想被呼叫就必須實現Controller介面,重寫Controller介面中的處理器方法。

  • 新增日誌

log4j.properties

  • 執行結果

執行結果

                                 如果覺得這篇文章對你有幫助  
                                    麻煩幫忙點個贊或關注
                                  這對我來說是一種很好的鼓勵
                                       在此先謝謝各位 
                                          O(∩_∩)O
複製程式碼

相關文章