SpringMVC的九大組件
SpringMVC是Spring框架中的一個表現層框架,也稱為控制層,SpringMVC中有很重要的九大組件
<!-- spring mvc的配置上下文 -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
從上面的配置可以看出,SpringMVC與WEB項目集成的入口就是這個DispatcherServlet類,這個類會加載我們配置的spring-mvc.xml文件,源碼如下:
public class DispatcherServlet extends FrameworkServlet {
/** Well-known name for the MultipartResolver object in the bean factory for this namespace. */
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
/** Well-known name for the LocaleResolver object in the bean factory for this namespace. */
public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
/** Well-known name for the ThemeResolver object in the bean factory for this namespace. */
public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
/**
* Well-known name for the HandlerMapping object in the bean factory for this namespace.
* Only used when "detectAllHandlerMappings" is turned off.
* @see #setDetectAllHandlerMappings
*/
public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
/**
* Well-known name for the HandlerAdapter object in the bean factory for this namespace.
* Only used when "detectAllHandlerAdapters" is turned off.
* @see #setDetectAllHandlerAdapters
*/
public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
/**
* Well-known name for the HandlerExceptionResolver object in the bean factory for this namespace.
* Only used when "detectAllHandlerExceptionResolvers" is turned off.
* @see #setDetectAllHandlerExceptionResolvers
*/
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
/**
* Well-known name for the RequestToViewNameTranslator object in the bean factory for this namespace.
*/
public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
/**
* Well-known name for the ViewResolver object in the bean factory for this namespace.
* Only used when "detectAllViewResolvers" is turned off.
* @see #setDetectAllViewResolvers
*/
public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
/**
* Well-known name for the FlashMapManager object in the bean factory for this namespace.
*/
public static final String FLASH_MAP_MANAGER_BEAN_NAME = "flashMapManager";
一共是十個方法,其中有一個初始化策略的方法initStrategies
/**
* This implementation calls {@link #initStrategies}.
*/
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
可看出,初始化策略是其他九個初始化方法的概括,而其他九個初始化方法就是我們要介紹的九大組件
- 1、MultipartResolver(文件處理器)
- 對應的初始化方法是initMultipartResolver(context),用於處理上傳請求。
- 處理方法是將普通的request包裝成MultipartHttpServletRequest,后者可以直接調用getFile方法獲取File。
- 2、LocaleResolver(當前環境處理器)
- 對應的初始化方法是initLocaleResolver(context),這就相當於配置數據庫的方言一樣,有了這個就可以對不同區域的用戶顯示不同的結果。
- SpringMVC主要有兩個地方用到了Locale:
- 一是ViewResolver視圖解析的時候;
- 二是用到國際化資源或者主題的時候。
- 3、ThemeResolver(主題處理器)
- 對應的初始化方法是initThemeResolver(context),用於解析主題。
- SpringMVC中一個主題對應一個properties文件,里面存放着跟當前主題相關的所有資源,如圖片、css樣式等。
- SpringMVC的主題也支持國際化。
- 4、HandlerMapping(處理器映射器)
- 對應的初始化方法是initHandlerMappings(context),這就是根據用戶請求的資源uri來查找Handler的。
- 在SpringMVC中會有很多請求,每個請求都需要一個Handler處理,具體接收到一個請求之后使用哪個Handler進行處理呢?這就是HandlerMapping需要做的事。
- 5、HandlerAdapters(處理器適配器)
- 對應的初始化方法是initHandlerAdapters(context),從名字上看,它就是一個適配器。
- Servlet需要的處理方法的結構卻是固定的,都是以request和response為參數的方法。
- 如何讓固定的Servlet處理方法調用靈活的Handler來進行處理呢?這就是HandlerAdapters要做的事情。
- 6、HandlerExceptionResolvers(異常處理器)
- 對應的初始化方法是initHandlerExceptionResolvers(context),其它組件都是用來干活的。
- 在干活的過程中難免會出現問題,出問題后怎么辦呢?這就要有一個專門的角色對異常情況進行處理,在SpringMVC中就是HandlerExceptionResolver。
- 7、RequestToViewNameTranslator(視圖名稱翻譯器),
- 對應的初始化方法是initRequestToViewNameTranslator(context),有的Handler處理完后並沒有設置View也沒有設置ViewName,這時就需要從request獲取ViewName了,如何從request中獲取ViewName就是RequestToViewNameTranslator要做的事情了。
- 8、ViewResolvers(頁面渲染處理器)
- 對應的初始化方法是initViewResolvers(context),ViewResolver用來將String類型的視圖名和Locale解析為View類型的視圖。
- View是用來渲染頁面的,也就是將程序返回的參數填入模板里,生成html(也可能是其它類型)文件。
- 9、FlashMapManager(參數傳遞管理器)
- 對應的初始化方法是initFlashMapManager(context),用來管理FlashMap的,FlashMap主要用在redirect重定向中傳遞參數。