一、需求開發過程
需求:前端瀏覽器請求url:
http://localhost:8080/demo/handle01,前端?面顯示后臺服務器的時間
開發過程
1)配置DispatcherServlet前端控制器
2)開發處理具體業務邏輯的Handler(@Controller、@RequestMApping)
3)xml配置文件配置controller掃描,配置springmvc三大件
4)將xml文件路徑告訴springmvc(DispatcherServlet)
二、Spring MVC 請求處理流程
流程說明
第一步:用戶發送請求至前端控制器DispatcherServlet
第二步:DispatcherServlet收到請求調用HandlerMapping處理器映射器
第三步:處理器映射器根據請求Url找到具體的Handler(后端控制器),生成處理器對象及處理器攔截器(如果有則生成)一并返回DispatcherServlet
第四步:DispatcherServlet調用HandlerAdapter處理器適配器去調用Handler
第五步:處理器適配器執行Handler
第六步:Handler執行完成給處理器適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一個底層對象,包括 Model 和 View
第八步:前端控制器請求視圖解析器去進行視圖解析,根據邏輯視圖名來解析真正的視圖。
第九步:視圖解析器向前端控制器返回View
第十步:前端控制器進行視圖渲染,就是將模型數據(在 ModelAndView 對象中)填充到 request 域
第十一步:前端控制器向用戶響應結果
三、Spring MVC 九大組件
- 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()方法獲得)的屬性OUTPUT_FLASH_MAP_ATTRIBUTE中,這樣在重定向之后的Handler中Spring就會自動將其設置到Model中,在顯示訂單信息的?面上就可以直接從Model中獲取數據。FlashMapManager 就是用來管理 FalshMap 的