springmvc工做原理及源碼分析

1、JavaEE體系結構

JavaEE體系結構

2、mvc 設計模式|思想

mvc設計思想

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

View 視圖層( html、jsp…)

Controller 控制層(委託模型層進行數據處理)
複製代碼

3、springmvc簡介

springmvc是一個web層mvc框架,相似struts2。
複製代碼

4、springmvc和spring之間關係

spring

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

5、sprigmvc和struts2的比較

實現機制:

struts2是基於過濾器實現的。

springmvc是基於servlet實現的。

運行速度:

由於過濾器底層是servlet,因此springmvc的運行速度會稍微比structs2快。

struts2是多例的           

springmvc單例的    

參數封裝:

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

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

6、springmvc的工做原理圖

springmvc工做原理圖

7、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將響應結果返回給用戶。
複製代碼

8、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...)
複製代碼

9、springmvc入門案例

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

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

pom.xml

  • 配置web.xml

由於DispatcherServlet自己就是一個Servlet,因此須要在web.xml配置。前端

web.xml

  • 配置springmvc.xml

1、使用默認加載springmvc配置文件的方式,必須按照如下規範:java

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

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

2、若是要不按照默認加載位置,則須要在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.jspapi

inde.jsp

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

springmvc代碼執行流程

  • 處理器映射器(配置多個處理器映射器能夠共存)
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
複製代碼

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

  • 處理器適配器(配置多個處理器適配器能夠共存)
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
複製代碼

功能:自定義的處理器(Controller)實現了Controller接口時,適配器就會執行Controller的具體方法。mvc

  • 處理器適配器源碼SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter源碼分析
SimpleControllerHandlerAdapter會自動判斷自定義的處理器(Controller)是否實現了Controller接口,若是是,它將會自動調用處理器的handleRequest方法。

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

所以,自定義的Controller要想被調用就必須實現Controller接口,重寫Controller接口中的處理器方法。

  • 添加日誌

log4j.properties

  • 運行結果

運行結果

若是以爲這篇文章對你有幫助  
                                    麻煩幫忙點個贊或關注
                                  這對我來講是一種很好的鼓勵
                                       在此先謝謝各位 
                                          O(∩_∩)O
複製代碼
相關文章
相關標籤/搜索