Spring MVC九大元件簡介說明

語言: CN / TW / HK

下文筆者講述Spring MVC九大元件簡介說明,如下所示

HandlerMappings

HandlerMapping是用來查詢Handler 也就是處理器 具體的表現形式可以是類也可以是方法 如: 標註了@RequestMapping每個method都可以看成是一個Handler 由Handler來負責實際的請求處理 HandlerMapping 在請求到達之後 它的作用便是找到請求相應的處理器Handler和Interceptors

HandlerAdapters

由於Servlet的方法結構都是如doService(HttpServletRequest req, HttpServletResponse resp) ,讓固定的Servlet處理方法呼叫Handler來進行處理,這一步工作便是 HandlerAdapter要做的事。

HandlerExceptionResolvers

用來處理Handler過程中產生的異常情況的元件 此元件的作用是根據異常設定ModelAndView 之後再交給render方法進行渲染,而render便將ModelAndView渲染成頁面 不過有一點 HandlerExceptionResolver只是用於解析對請求做處理階段產生的異常而渲染階段的異常 這也是Spring MVC元件設計的一大原則分工明確互不干涉。

ViewResolvers

這個元件的主要作用,便是將String型別的檢視名和Locale解析為View型別的檢視 這個介面只有一個resolveViewName()方法。 從方法的定義就可以看出,Controller層返回的String型別的檢視名viewName , 最終會在這裡被解析成為View.View是用來渲染頁面的 它會將程式返回的引數和資料填入模板中,最終生成html檔案 ViewResolver在這個過程中,主要做兩件大事 即ViewResolver 會找到渲染所用的模板(使用什麼模板來渲染?) 和所用的技術(其實也就是檢視的型別,如JSP啊還是其他什麼Blabla的)填入引數 預設情況下,Spring MVC會為我們自動配置一個InternalResourceViewResolver,這個是針對JSP型別檢視的。

RequestToViewNameTranslator

從Request中獲取viewName ViewResolver是根據ViewName查詢View 但有的 Handler處理完成之後 沒有設定View也沒有設定ViewName 便要通過這個元件來從Request中查詢viewName。

LocaleResolver

LocaleResolver用於從request 中解析出Locale 在中國大陸地區 Locale當然就會是zh-CN之類 用來表示一個區域。這個類也是i18n的基礎。

ThemeResolver

這個類是用來解析主題的 主題,就是樣式,圖片以及它們所形成的顯示效果的集合 Spring MVC中一套主題對應一個properties檔案 裡面存放著跟當前主題相關的所有資源 如圖片,css樣式等。建立主題非常簡單,只需準備好資源 然後新建一個“主題名.properties”並將資源設定進去 放在classpath下,便可以在頁面中使用了 Spring MVC中跟主題有關的類 有ThemeResolver, ThemeSource和Theme。ThemeResolver負責 從request中解析出主題名 ThemeSource則根據主題名找到具體的主題 其抽象也就是 Theme 通過Theme來獲取主題和具體的資源。

MultipartResolver

MultipartResolver用於處理上傳請求 通過將普通的Request包裝成MultipartHttpServletRequest來實現 MultipartHttpServletRequest 可以通過getFile(直接獲得檔案,如果是多個檔案上傳 還可以通過呼叫getFileMap得到Map<FileName, File> MultipartResolver的作用就是用來封裝普通的request 使其擁有處理檔案上傳的功能

FlashMapManager

```

FlashMap用於重定向Redirect時的引數資料傳遞 如,在處理使用者訂單提交時,為了避免重複提交,可以處理完post請求後redirect到一個get請求 這個get請求可以用來顯示訂單詳情之類的資訊。這樣做雖然可以規避使用者重新整理重新提交表單的問題 但是在這個頁面上要顯示訂單的資訊,那這些資料從哪裡去獲取呢 因為redirect重定向是沒有傳遞引數這一功能的 如果不想把引數寫進url(其實也不推薦這麼做,url有長度限制不說, 把引數都直接暴露,感覺也不安全),那麼就可以通過flashMap來傳遞。 只需要在redirect 之前,將要傳遞的資料寫入request( 可以通過ServletRequestAttributes.getRequest()獲得)的屬性 OUTPUT_FLASH_MAP_ATTRIBUTE中 在redirect之後的handler中 spring 就會自動將其設定到 Model中,在顯示訂單資訊的頁面上, 就可以直接從 Model中取得資料了。而FlashMapManager就是用來管理FlashMap ```