講到MVC,想必你們都很熟悉,就是將數據模型、視圖、控制器進行分離,作到分工明確,在Spring的幫助下,Spring MVC 更是作到了充分的解耦,由於大部分的資源都由Spring進行管理,爲Spring MVC提供了方便,好比Controller層,會用到Spring的依賴注入功能,只用聲明一個接口,Spring就會自動將須要的對象進行注入,這樣有兩個好處,一個是更加的方便,另外一個是使得程序充分的解耦!你想一想,因爲只聲明瞭一個接口,因此調用層不用理會下層的實現,上層的修改也不會致使調用層代碼的修改,這不是很是棒的嗎! 講了那麼多,進入咱們今天的主題:Spring MVCweb
下面,因爲網上關於源碼分析的文章已經很是多了,我這裏就不貼源碼了,直接對Spring MVC作一個個人理解服務器
1.Spring 和 Spring MVC 的關係session
個人理解是,Spring 能夠當作是爲Spring MVC提供對象注入服務的app
Spring 的容器通常會在web項目啓動的時候,經過監聽器進行初始化,而且做爲ServletContext的屬性,放在ServletContext中,而後在初始化DisptcherServlet以前,有一個FrameworkServlet,他是DispatcherServlet的父類,它會將Spring 的IOC容器設置爲當前Spring MVC容器的父類,這樣,在Spring MVC中,就能夠使用Spring IOC中的對象了源碼分析
2.Spring MVC執行流程梳理post
(1) 首先請求到達服務器,被DispatherServlet攔截spa
(2)DispatcherServlet經過以前已經初始化好的HandlerMapping進行Handler以及Interceptor的查找,Handler就是咱們編寫的Controllercode
(3)找到後先執行攔截器Interceptor的方法preHandle方法對象
(4)利用HandlerAdapter執行Handler的方法,而且返回ModelAndView給DispatcherServletblog
(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();