javascript
SpringMVC源码分析(4)剖析DispatcherServlet重要组件
簡單介紹了一個請求的處理過程, 簡略描述了調用過程,并沒有涉及過多細節,如url匹配,報文解析轉換等。
<SpringMVC源碼分析(2)DispatcherServlet的初始化>:介紹了servlet的初始化過程,尤其initStrategies方法。
本文主要總結DispatcherServlet幾個重要組件的關系。
1.類圖
該類圖并沒有全面的描述SpringMVC相關類,重點說明組件的關系。
該類圖基于springmvc3.0.5版本。
很多類屬性并沒有完全羅列,進行了取舍。
基于DispatcherServlet,而且深度盡量適可而止,否則造成圖復雜混亂。
---------------------------------------------------
2.HanlerMapping組件介紹
2.1?HanlerMapping類圖
HanlerMapping是springmvc中完成url到controller映射的組件。
2.2?HanlerMappingAPI
| 1 2 3 4 | public?interface?HandlerMapping?{ ????//根據選擇策略,返回Handler ????HandlerExecutionChain?getHandler(HttpServletRequest?request)?throws?Exception; } |
3.HandlerAdapter
3.1類圖
是MVC framework SPI ;負責具體干活。如調用方法,參數解析等。
3.2 API
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public?interface?HandlerAdapter?{ ???? ???/** ????????????判斷是否可以處理handler ????*/ ???boolean?supports(Object?handler);? ???? ???/** ????*?處理請求 ????*/ ???ModelAndView?handle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)?throws?Exception; ???/** ????*?getLastModified ????*/ ???long?getLastModified(HttpServletRequest?request,?Object?handler); } |
4.HandlerExceptionResolver
4.1 HandlerExceptionResolver類圖
專門處理異常情況,根據異常情況,構造ModelAndView
4.2 HandlerExceptionResolver API
| 1 2 3 4 5 6 7 8 9 | public?interface?HandlerExceptionResolver?{ ???/** ????*?處理異常 ????*/ ???ModelAndView?resolveException( ?????????HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?Exception?ex); } |
5.? ViewResolver
5.1 ViewResolver類圖
作用:將string的視圖名稱解析為View類型的視圖
5.2 ViewResolver API
| 1 2 3 4 5 6 7 8 9 | public?interface?ViewResolver?{ ???/**? ????*?Resolve?the?given?view?by?name. ???????解析視圖 ????*/ ???View?resolveViewName(String?viewName,?Locale?locale)?throws?Exception; } |
6.RequestToViewNameTranslator
默認實現是DefaultRequestToViewNameTranslator.主要作用是根據請求信息獲取視圖名稱。
| 1 2 3 4 5 | public?interface?RequestToViewNameTranslator?{ ???String?getViewName(HttpServletRequest?request)?throws?Exception; } |
7.LocaleResolver
7.1 LocaleResolver類圖
從request解析Locale,實現本地化;一般使用在解析視圖時使用;和使用國際化資源和主題時使用
7.2 LocaleResolver API
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public?interface?LocaleResolver?{ ??/** ???*?Resolve?the?current?locale?via?the?given?request. ???*?Should?return?a?default?locale?as?fallback?in?any?case. ???*?@param?request?the?request?to?resolve?the?locale?for ???*?@return?the?current?locale?(never?<code>null</code>) ???*/ ???Locale?resolveLocale(HttpServletRequest?request); ??/** ???*?Set?the?current?locale?to?the?given?one. ???*?@param?request?the?request?to?be?used?for?locale?modification ???*?@param?response?the?response?to?be?used?for?locale?modification ???*?@param?locale?the?new?locale,?or?<code>null</code>?to?clear?the?locale ????*?@throws?UnsupportedOperationException?if?the?LocaleResolver?implementation ????*?does?not?support?dynamic?changing?of?the?theme ???*/ ???void?setLocale(HttpServletRequest?request,?HttpServletResponse?response,?Locale?locale); } |
8.ThemeResolver
8.1 ThemeResolver類圖
主要用來設置主題。
8.2 API
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public?interface?ThemeResolver?{ ??/** ???*?Resolve?the?current?theme?name?via?the?given?request. ???*?Should?return?a?default?theme?as?fallback?in?any?case. ???*?@param?request?request?to?be?used?for?resolution ???*?@return?the?current?theme?name ???*/ ???String?resolveThemeName(HttpServletRequest?request); ??/** ???*?Set?the?current?theme?name?to?the?given?one. ???*?@param?request?request?to?be?used?for?theme?name?modification ???*?@param?response?response?to?be?used?for?theme?name?modification ???*?@param?themeName?the?new?theme?name ????*?@throws?UnsupportedOperationException?if?the?ThemeResolver?implementation ????*?does?not?support?dynamic?changing?of?the?theme ???*/ ???void?setThemeName(HttpServletRequest?request,?HttpServletResponse?response,?String?themeName); } |
9.MultipartResolver?
默認實現為CommonsMultipartResolver,處理文件上傳請求。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public?interface?MultipartResolver?{ ???/** ????*?Determine?if?the?given?request?contains?multipart?content. ????*/ ???boolean?isMultipart(HttpServletRequest?request); ???/** ????*?Parse?the?given?HTTP?request?into?multipart?files?and?parameters, ????*?and?wrap?the?request?inside?a ????*/ ???MultipartHttpServletRequest?resolveMultipart(HttpServletRequest?request)?throws?MultipartException; ???/** ????*?Cleanup?any?resources?used?for?the?multipart?handling, ????*/ ???void?cleanupMultipart(MultipartHttpServletRequest?request); } |
10 總結。
簡單介紹了下各個組件,每個組件都各司其職,互相配合。才有了強大的SpringMVC功能。在以后的文章里,針對每個組件,會結合具體例子,由淺入深式的進行剖析。
另外一個重要的核心部分是HandlerMethodInvoker,涉及的東西比較多,非常有看頭。
本文轉自 randy_shandong 51CTO博客,原文鏈接:http://blog.51cto.com/dba10g/1878735,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的SpringMVC源码分析(4)剖析DispatcherServlet重要组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用ctrl+z停掉任务再kill的暴力
- 下一篇: topcoder srm 500 div