新的一年,開啓新的篇章,歐氣滿滿,迎接未來.
前幾天回顧了spring相關的知識點,現在再來回顧下springmvc相關的知識點做一下總結.
問題總結
之前面試問題總結的那篇文章中,與springmvc相關的有哪些問題:
springmvc的工作流程?
springmvc dispatcherservlet與handleradapter如何關聯?
有了springmvc的IOC容器,還需要spring的IOC容器嗎?爲什麼?如何處理兼容問題?
tomcat容器如何與springmvc的dispatcherservlet通信的?
問題梳理
springmvc的工作流程
我根據springmvc的流程將流程圖畫了出來:
請求過來之後,dispatcherServlet的url-pattern攔截請求;
判斷在springmvc中是否存在對應映射;
若不存在,判斷是否配置
如果配置,就會找到目標資源,沒有則顯示404頁面;
如果映射存在,則由handlerMapping獲handlerExecutionChain對象;
(注意兩點:
① handlerMapping定義了請求到處理器之間的映射,如果發送的請求是沒有映射的,那麼得到的handlerExecutionChain也不爲空,而是默認的defaultServletHTTPRequestHandler,用來處理靜態資源等(配置了default-servlet-handler,否則報爲404);
② handlerExecutionChain實際上包含了攔截器和目標方法.)
獲取HandlerAdapter對象;
(包含表單類型的校驗,數據類型的轉換,格式換等功能)
調用 interceptor攔截器的preHandle方法;
調用目標方法;
調用攔截器的postHandle方法;
處理視圖時候,觀察是否存在異常,存在異常,則由HandlerExceptionResolver來處理異常,並得到新的ModelAndView對象;不存在異常,則由ViewResolver視圖解析器來解析視圖;
調用攔截器的afterComplettion方法;
springmvc DispatcherServlet與handlerAdapter如何關聯?
DispatcherServlet攔截到請求之後,根據handlerMapping獲取到handlerExecutionChain對象,然後,在handlerExecutionChain對象不爲null的情況下,根據handlerExecutionChain中的handler對象獲取HandlerAdapter對象;有了springmvc的IOC容器,還需要spring的IOC容器嗎?爲什麼?如何處理兼容問題?
這個問題再進一步,換個方式提問即是否還需要在web.xml方法裏面配置啓動springIOC容器的ContextLoaderListener?
可以從正反兩方面來回答,首先是需要,通常情況下,類似於數據源,事務,整合其他框架等都是放在spring的配置文件中,而不是springmvc的配置文件中, 一般情況下,開發過程中的Service,Dao也都是放在spring的IOC容器當中;其次可以是不需要的,也可以都放在springmvc的配置文件當中,當然需要分多個spring的配置文件,然後通過import節點導入到springmvc的配置文件當中.幾點要注意的地方:
1. springIOC容器和springmvc的IOC容器 掃描的部分有重合的地方,就會導致bean被創建2次,解決方案:使用 exclude-filter和include-filter配合來區分哪些bean交給springIOC容器,哪些bean交給springmvcIOC容器;
2. springmvc IOC容器裏面的bean可以引用springIOC容器的bean,反之則不行,多個springIOC 容器之間可以設置爲父子關係,以實現良好的解耦.舉個栗子,springIOC容器好比是全局作用域,springmvcIOC容器好比是局部作用域,局部的可以引用全局的,而全局的卻不能引用局部的.
tomcat容器如何與springmvc的dispatcherservlet通信的?
Apache Tomcat軟件是JavaServlet,JavaServerPages,Java ExpressionLanguage和JavaWebSocket技術的開源實現,SpringMVC則是spring推出的基於servlet標準的MVC框架實現,由此可知,SpringMvc和Tomcat 的結合點就是Servlet.SpringMVC的DispatcherServlet繼承了HttpServlet,那麼對於tomcat來說,springmvc實際就是一個Servlet.一個http請求的具體處理流程:
1. 用戶向tomcat容器發送一個請求;
2. tomcat容器接收到請求之後,分析客戶的請求信息;
3. tomcat創建一個Httprequest對象,將用戶的請求信息封裝到該對象中;
4. tomcat創建一個HttpResponse對象;
5. tomcat調用HttpServlet的Service方法,將Httprequest,HTTPResponse傳遞給Httpservlet對象;
在此我向大家推薦一個架構學習交流圈:830478757 幫助突破瓶頸 提升思維能力
6. HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息,HttpServlet調用HttpResponse對象的有關方法,生成響應數據;
7. tomcat把HttpServlet的響應結果傳給Web客戶.
要注意的幾點東西:
①:web.xml配置文件的作用其實就是配置http請求和servlet之間的映射關係,通過這個配置文件,Tomcat可以把請求轉發給不同的servlet實例;
②:springmvc也是servlet標準的一個實現,所有的http請求都映射到DispatcherServlet上去,這個時候,請求就已經由Tomcat轉發到springmvc框架中去了,接着再由DispatcherServlet將請求轉發到各個Controller當中去.
小結
這篇文章主要回顧了springmvc框架的如何處理http請求的過程,以及其和Tomcat容器之間的請發轉發是如何實現的,如果能夠熟練掌握,面試碰到相關的問題,也能夠侃侃而談了,同時也是在平時CURD之餘,對框架有一個更深層次的理解,不但要會用,還要懂得其原理.