Spring MVC淺析

  講到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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章