spring架構---spring-mvc執行原理解讀
上來一張圖,沒圖沒真相:
1、 使用者傳送請求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
3、 處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢),生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4、 DispatcherServlet呼叫HandlerAdapter處理器介面卡。
5、 HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。
6、 Controller執行完成返回ModelAndView。
7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
8、 DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器。
9、 ViewReslover解析後返回具體View。
10、DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。
11、 DispatcherServlet響應使用者。
元件說明:
以下元件通常使用框架提供實現:
DispatcherServlet:作為前端控制器,整個流程控制的中心,控制其它元件執行,統一排程,降低元件之間的耦合性,提高每個元件的擴充套件性。
HandlerMapping:通過擴充套件處理器對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。
HandlAdapter:通過擴充套件處理器介面卡,支援更多型別的處理器。
ViewResolver:通過擴充套件檢視解析器,支援更多型別的檢視解析,例如:jsp、freemarker、pdf、excel等。
元件:
1、前端控制器DispatcherServlet(不需要工程師開發),由框架提供
作用:接收請求,響應結果,相當於轉發器,中央處理器。有了dispatcherServlet減少了其它元件之間的耦合度。
使用者請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其它元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。
2、處理器對映器HandlerMapping(不需要工程師開發),由框架提供
作用:根據請求的url查詢Handler
HandlerMapping負責根據使用者請求找到Handler即處理器,springmvc提供了不同的對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。
3、處理器介面卡HandlerAdapter
作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。
4、處理器Handler(需要工程師開發)
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣介面卡才可以去正確執行Handler
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的使用者請求進行處理。
由於Handler涉及到具體的使用者業務請求,所以一般情況需要工程師根據業務需求開發Handler。
5、檢視解析器View resolver(不需要工程師開發),由框架提供
作用:進行檢視解析,根據邏輯檢視名解析成真正的檢視(view)
View Resolver負責將處理結果生成View檢視,View Resolver首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。 springmvc框架提供了很多的View檢視型別,包括:jstlView、freemarkerView、pdfView等。
一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由工程師根據業務需求開發具體的頁面。
6、檢視View(需要工程師開發jsp...)
View是一個介面,實現類支援不同的View型別(jsp、freemarker、pdf...)
一次真正的客戶端請求到伺服器再到使用者端的全過程描述:
首先使用者在瀏覽器欄中輸入一個網址如www.baidu.com這樣的域名,首先DNS(ISPDNS伺服器)會根據你的域名為你解析成你要訪問的ip地址和某個埠(IP:埠)這樣的形式,當你的請求以http協議到達伺服器的埠後, tomcat會呼叫windows提供的方法對埠進行輪期詢問,每當接受到新資料後,就將資料傳輸到tomcat上面,tomcat拿到資料後解析http協議拿到所需要的資料後根據你要訪問的路徑名進入到某個你正在執行的專案中,假如進入的專案是用spring-mvc來搭建的話,首先這個請求被一直執行的listener監聽器攔截到,也就是你在web.xml中配置的這個:
監聽器攔截到請求後又將他轉發給 Dispatcher(前端控制器)也可以理解為spring-mvc中的"cpu"
其中大多數的操作由他來控制進行,DispatcherServlet拿到這個請求後,然後再呼叫HandlerMapping(處理器對映器)獲取Handler,這裡獲取到的Handler是什麼呢?我們知道在一個專案中後臺有許多controller,dao,model,entity,service,utils,在這些後臺邏輯實現中,我們為許多類和方法加了註解,如給controller裡面一個方法加了@RequestMapping,這個專案在tomcat執行的時候spring就會通過
這個自動掃描將所有加過註解的方法用map結構存成key-value形式的鍵值對,key值儲存該方法的訪問路徑,如
我這裡的這個儲存的路徑就是
http://Localhost:8080/shopping/views/hello(localhost是主機名,這裡也可是ip地址,8080是埠名,不寫預設8080埠,shopping為我的專案名).
value值裡面儲存的是該方法的類路徑+方法名,如:
com.qcr.controllers.classification.Show.hello(胡寫的 反正就是這個意思啊)
然後通過比對key值獲取到要執行的value值也就是要執行的類方法,返回給DispatcherServlet前端控制器, 然後DispatcherServlet呼叫HandlerAdapter處理器介面卡來執行該Handler,通過反射和代理的方法, HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器),Controller執行完畢後返回一個ModelAndView,HandlerAdapter處理器介面卡將controller執行結果ModelAndView返回給DispatcherServlet,DispatcherServlet再將ModelAndView傳給ViewReslover檢視解析器,ViewReslover解析後返回具體View,前端控制器對檢視進行渲染,View生產一個httpResponse響應返回到Tomcat上面再又轉發給客戶端,至此整個請求在spring-mvc執行的過程全部結束.....