從名字上看,handleradapter 是乙個介面卡。因為spring mvc中handler 可以是任意形式的,只要能夠處理請求便可。但是把請求交給servlet 的時候,由於servlet 的方法結構都是
doservice(httpservletrequest req, httpservletresponse resp)形式的,要讓固定的servlet 處理方法呼叫handler來進行處理,這一步 工作便是handleradapter要做的事。
其它元件都是用來幹活的。在幹活的過程中難免會出現問題,出問題後怎麼辦呢?這就需要有乙個專門的角色對異常情況進行處理,在springmvc中就是handlerexceptionresolver。
handlerexceptionresolver 是用來處理handler 產生的異常情況的元件。具體來說,此元件的作用是根據異常設定modelandview, 之後交給渲染方法進行渲染,渲染方法會將modelandview渲染成頁面。
不過要注意,handlerexceptionresolver 只用於解析對請求做處理階段產生的異常,渲染階段的異常不歸它管,這也是springmvc元件設計的一大原則一分工明確、互不干涉。
viewresolver 的主要作用是將string 型別的檢視名和locale解析為view 型別的檢視,只有乙個resolveviewname()方法。從方法的定義可以看出,controller層返回的string 型別的檢視名viewname最終會在這裡被解析成為view。
view 是用來渲染頁面的,也就是說,它會將程式返回的引數和資料填入模板中,生成html檔案。viewresolver在這個過程中主要做兩件大事: viewresolver 會找到渲染所用的模板(第一件大事)和所用的技術(第二件大事,其實也就是找到檢視的型別,如jsp)並填入引數。
預設情況下,spring mvc會為我們自動配置乙個internalresourceviewresolver,是針對jsp型別檢視的。
requesttoviewnametranslator元件的作用是從請求中獲取viewname。因為viewresolver根據viewname查詢view,但有的handler處理完成之後,沒有設定view,也沒有設定viewname,
便要通過這個元件來從請求中查詢viewname。
requesttoviewnametranslator在spring mvc容器裡只可以配置乙個,所以所有request到viewname的轉換規則都要在乙個translator裡面全部實現。
解析檢視需要兩個引數:一是檢視名,另乙個是locale。檢視名是處理器返回的,locale是從**來的?這就是localeresolver要做的事情。localeresolver用於從request解析出locale,locale就是zh-cn之類,表示乙個區域,有了這個就可以對不同區域的使用者顯示不同的結果。
springmvc主要有兩個地方用到了locale:一是viewresolver視**析的時候;二是用到國際化資源或者主題的時候。
springmvc的主題也支援國際化,同乙個主題不同區域也可以顯示不同的風格。springmvc中跟主題相關的類有 themeresolver、themesource和theme。主題是通過一系列資源來具體體現的,要得到乙個主題的資源,首先要得到資源的名稱,這是themeresolver的工作。然後通過主題名稱找到對應的主題(可以理解為乙個配置)檔案,其抽象也就是theme,這是themesource的工作。最後從主題中通過theme來獲取主題和具體的資源。
用於處理上傳請求。處理方法是將普通的request包裝成multiparthttpservletrequest,後者可以直接呼叫getfile方法獲取file,如果上傳多個檔案,還可以呼叫getfilemap得到filename->file結構的map。此元件中一共有三個方法,作用分別是判斷是不是上傳請求,將request包裝成multiparthttpservletrequest、處理完後清理上傳過程中產生的臨時資源。
說到flashmapmanager元件,得先說一下flashmap。
flashmap用於重定向時的引數傳遞,比如在處理使用者訂單時,為了避免重複提交,可以處理完post請求後重定向到乙個get請求,這個get請求可以用來顯示訂單詳情之類的資訊。這樣做雖然可以規避使用者重新提交訂單的問題,但是在這個頁面上要顯示訂單的資訊,這些資料從**獲取呢?因為重定向是沒有傳遞引數這一功能的,如果不想把引數寫進url(其實也不推薦這麼做,除了url有長度限制,把引數都直接暴露也不安全),那麼就可以通過flashmap來傳遞。只需要在重定向之前將要傳遞的資料寫入請求(可以通過servletrequesttributes getrequest(方法獲得)的屬性output_ flash_ map attribute中,這樣在重定向之後的handler中spring就會自動將其設定到model中,在顯示訂單資訊的頁面上就可以直接從model中獲得資料。
flashmapmanager就是用來管理flashmap的。
通過對此9大元件的巨集觀認識,對分析springmvc的設計、原理與實現都會有很大的幫助作用。
(1)(2)
(3)《spring5核心原理與30個類手寫實戰》
SpringMVC九大元件
handleradapter 運用了設計模式中的介面卡模式,統一呼叫不同的handler。handerexceptionresolver viewresolver 將string和locale解析為view。requesttoviewtranslator 從request中提取viewname。lo...
SpringMVC中的九大元件
handleradapter 幫助dispatcherservlet呼叫對映到請求的處理程式,而不管該處理程式實際是如何呼叫的。例如,呼叫帶注釋的控制器需要解析注釋。handleradapter的主要目的是保護dispatcherservlet不受這些細節的影響。handlerexceptionre...
springmvc十六 九大元件
dispatcherservlet中有九個引用型別的屬性,這就是springmvc的九大元件。springmvc在工作的時候,關鍵位置都是由這些元件完成的。multipartresolver used by this servlet 檔案上傳解析器 private multipartresolver...