講到MVC,想必大家都很熟悉,就是將數據模型、視圖、控制器進行分離,做到分工明確,在Spring的幫助下,Spring MVC 更是做到了充分的解耦,因爲大部分的資源都由Spring進行管理,爲Spring MVC提供了方便,比如Controller層,會用到Spring的依賴注入功能,只用聲明一個接口,Spring就會自動將需要的對象進行注入,這樣有兩個好處,一個是更加的方便,另一個是使得程序充分的解耦!你想想,由於只聲明瞭一個接口,所以調用層不用理會下層的實現,上層的修改也不會導致調用層代碼的修改,這不是非常棒的嗎! 講了那麼多,進入我們今天的主題:Spring MVC
下面,由於網上關於源碼分析的文章已經非常多了,我這裏就不貼源碼了,直接對Spring MVC做一個我的理解
1.Spring 和 Spring MVC 的關係
我的理解是,Spring 可以看成是爲Spring MVC提供對象注入服務的
Spring 的容器一般會在web項目啓動的時候,通過監聽器進行初始化,並且作爲ServletContext的屬性,放在ServletContext中,然後在初始化DisptcherServlet之前,有一個FrameworkServlet,他是DispatcherServlet的父類,它會將Spring 的IOC容器設置爲當前Spring MVC容器的父類,這樣,在Spring MVC中,就可以使用Spring IOC中的對象了
2.Spring MVC執行流程梳理
(1) 首先請求到達服務器,被DispatherServlet攔截
(2)DispatcherServlet通過之前已經初始化好的HandlerMapping進行Handler以及Interceptor的查找,Handler就是我們編寫的Controller
(3)找到後先執行攔截器Interceptor的方法preHandle方法
(4)利用HandlerAdapter執行Handler的方法,並且返回ModelAndView給DispatcherServlet
(5)執行攔截器Interceptor的postHandler方法
(6)定位到ModelAndView中的頁面,將數據嵌入,再進行頁面的渲染
(7)響應用戶
3.若是想在Service或者其他地方用到request對象,應該怎麼處理
這裏主要有兩種方法
其一:在service中需要request對象,可以通過Controller的幫助,在Controller中聲明request爲參數,Spring MVC就會自動爲我們注入這個對象,然後我們再將這個對象傳入其他方法比如Service中的方法,就可以實現了
還有一種方法就是:利用RequestContextHolder進行操作,RequestContextHolder裏面封裝了RequestAttributes,這個RequestAttributes中有get、set、removeAttribute,而且因爲實際封裝的是ServletRequestAttributes,所以可以用以下方式獲得request或session
//獲取request
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
//獲取session
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpSession session = ((ServletRequestAttributes)requestAttributes).getRequest().getSession();