SpringMVC請求處理流程
流程說明
第⼀步:⽤戶發送請求⾄前端控制器DispatcherServlet
第⼆步: DispatcherServlet收到請求調⽤HandlerMapping處理器映射器
第三步:處理器映射器根據請求Url找到具體的Handler(后端控制器),⽣成處理器對象及處理器攔截器(如果 有則⽣成)⼀並返回DispatcherServlet
第四步: DispatcherServlet調⽤HandlerAdapter處理器適配器去調⽤Handler
第五步:處理器適配器執⾏Handler
第六步: Handler執⾏完成給處理器適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回 ModelAndView, ModelAndView 是SpringMVC 框架的⼀個底層對 象,包括 Model 和 View
第⼋步:前端控制器請求視圖解析器去進⾏視圖解析,根據邏輯視圖名來解析真正的視圖。
第九步:視圖解析器向前端控制器返回View
第⼗步:前端控制器進⾏視圖渲染,就是將模型數據(在 ModelAndView 對象中)填充到 request 域
第⼗⼀步:前端控制器向⽤戶響應結果
SpringMVC九大組件
HandlerMapping(處理器映射器)
HandlerMapping 是⽤來查找 Handler 的,也就是處理器,具體的表現形式可以是類,也可以是⽅法。⽐如,標注了@RequestMapping的每個⽅法都可以看成是⼀個Handler。 Handler負責具體實際的請求處理,在請求到達后, HandlerMapping 的作⽤便是找到請求相應的處理器
Handler 和 Interceptor.
HandlerAdapter(處理器適配器)
HandlerAdapter 是⼀個適配器。因為 Spring MVC 中 Handler 可以是任意形式的,只要能處理請求即可。但是把請求交給 Servlet 的時候,由於 Servlet 的⽅法結構都是
doService(HttpServletRequest req,HttpServletResponse resp)形式的,要讓固定的
Servlet 處理⽅法調⽤ Handler 來進⾏處理,便是 HandlerAdapter 的職責。
HandlerExceptionResolver
HandlerExceptionResolver ⽤於處理 Handler 產⽣的異常情況。它的作⽤是根據異常設置
ModelAndView,之后交給渲染⽅法進⾏渲染,渲染⽅法會將 ModelAndView 渲染成⻚⾯。
ViewResolver
ViewResolver即視圖解析器,⽤於將String類型的視圖名和Locale解析為View類型的視圖,只有⼀個resolveViewName()⽅法。從⽅法的定義可以看出, Controller層返回的String類型視圖名viewName 最終會在這⾥被解析成為View。 View是⽤來渲染⻚⾯的,也就是說,它會將程序返回的參數和數據填⼊模板中,⽣成html⽂件。 ViewResolver 在這個過程主要完成兩件事情:
ViewResolver 找到渲染所⽤的模板(第⼀件⼤事)和所⽤的技術(第⼆件⼤事,其實也就是找到視圖的類型,如JSP)並填⼊參數。默認情況下, Spring MVC會⾃動為我們配置⼀個
InternalResourceViewResolver,是針對 JSP 類型視圖的。
RequestToViewNameTranslator
RequestToViewNameTranslator 組件的作⽤是從請求中獲取 ViewName.因為 ViewResolver 根據ViewName 查找 View,但有的 Handler 處理完成之后,沒有設置 View,也沒有設置
ViewName,便要通過這個組件從請求中查找 ViewName。
LocaleResolver
ViewResolver 組件的 resolveViewName ⽅法需要兩個參數,⼀個是視圖名,⼀個是
Locale。
LocaleResolver ⽤於從請求中解析出 Locale,⽐如中國 Locale 是 zh-CN,⽤來表示⼀個區域。這個組件也是 i18n 的基礎。
ThemeResolver
ThemeResolver 組件是⽤來解析主題的。主題是樣式、圖⽚及它們所形成的顯示效果的集合。
Spring MVC 中⼀套主題對應⼀個 properties⽂件,⾥⾯存放着與當前主題相關的所有資源,如圖⽚、 CSS樣式等。創建主題⾮常簡單,只需准備好資源,然后新建⼀個“主題名.properties”並將資
源設置進去,放在classpath下,之后便可以在⻚⾯中使⽤了。 SpringMVC中與主題相關的類有
ThemeResolver、 ThemeSource和Theme。 ThemeResolver負責從請求中解析出主題名,
ThemeSource根據主題名找到具體的主題,其抽象也就是Theme,可以通過Theme來獲取主題和具體的資源。
MultipartResolver
MultipartResolver ⽤於上傳請求,通過將普通的請求包裝成 MultipartHttpServletRequest
來實現。 MultipartHttpServletRequest 可以通過 getFile() ⽅法 直接獲得⽂件。如果上傳多個⽂件,還可以調⽤ getFileMap()⽅法得到Map<FileName, File>這樣的結構, MultipartResolver 的作⽤就是封裝普通的請求,使其擁有⽂件上傳的功能。
FlashMapManager
FlashMap ⽤於重定向時的參數傳遞,⽐如在處理⽤戶訂單時候,為了避免重復提交,可以處理完post請求之后重定向到⼀個get請求,這個get請求可以⽤來顯示訂單詳情之類的信息。這樣做雖然可以規避⽤戶重新提交訂單的問題,但是在這個⻚⾯上要顯示訂單的信息,這些數據從哪⾥來獲得呢?因為重定向時么有傳遞參數這⼀功能的,如果不想把參數寫進URL(不推薦),那么就可以通過FlashMap來傳遞。只需要在重定向之前將要傳遞的數據寫⼊請求(可以通過
ServletRequestAttributes.getRequest()⽅法獲得)的屬性UTPUT_FLASH_MAP_ATTRIBUTE
中,這樣在重定向之后的Handler中Spring就會⾃動將其設置到Model中,在顯示訂單信息的⻚⾯上就可以直接從Model中獲取數據。 FlashMapManager 就是⽤來管理 FalshMap 的。