您好,登錄后才能下訂單哦!
HandlerMapping
根據(jù) request 找到對(duì)應(yīng)的處理器 Handler 和 Interceptors。內(nèi)部只有一個(gè)方法
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
HandlerAdapter
Handler 適配器,內(nèi)部方法如下:
boolean supports(Object handler);//判斷是否可以使用某個(gè) Handler
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; //具體使用
long getLastModified(HttpServletRequest request, Object handler);//獲取資源上一次修改的時(shí)間
HandlerExceptionResolver
根據(jù)異常設(shè)置 ModelAndView ,再交給 render 方法進(jìn)行渲染。
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex)
ViewResolver
用來(lái)將 String 類型的視圖名和 Locale 解析為 View 類型的視圖。
View resolveViewName(String viewName, Locale locale) throws Exception;
它的一個(gè)實(shí)現(xiàn)類 BeanNameViewResolver,它重寫(xiě) resolveViewName 方法如下:
public View resolveViewName(String viewName, Locale locale) throws BeansException {
ApplicationContext context = getApplicationContext();
//如果應(yīng)用上下文沒(méi)有找到視圖,返回 null
if (!context.containsBean(viewName)) {
if (logger.isDebugEnabled()) {
logger.debug("No matching bean found for view name '" + viewName + "'");
}
// Allow for ViewResolver chaining...
return null;
}
//如果找到的視圖類型不匹配,也返回 null
if (!context.isTypeMatch(viewName, View.class)) {
if (logger.isDebugEnabled()) {
logger.debug("Found matching bean for view name '" + viewName +
"' - to be ignored since it does not implement View");
}
// Since we're looking into the general ApplicationContext here,
// let's accept this as a non-match and allow for chaining as well...
return null;
}
//根據(jù)視圖名稱從 Spring 容器中查找 Bean,返回找到的 bean
return context.getBean(viewName, View.class);
}
RequestToViewNameTranslator
獲取 request 中的視圖名。接口里面也是只有一個(gè)方法:
String getViewName(HttpServletRequest request) throws Exception; //根據(jù) request 查找視圖名
LocaleResolver
用于從 request 解析出 Locale。
public interface LocaleResolver {
//從 request 解析出 Locale
Locale resolveLocale(HttpServletRequest request);
//根據(jù) request 設(shè)置 locale
void setLocale(HttpServletRequest request, HttpServletResponse response, @Nullable Locale locale);
}
ThemeResolver
解析主題
public interface ThemeResolver {
//通過(guò)給定的 request 查找主題名
String resolveThemeName(HttpServletRequest request);
//根據(jù)給定的 request 設(shè)置主題名
void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName);
}
在 RequestContext.java 文件中可以獲取主題:
public String getThemeMessage(String code, String defaultMessage) {
//獲取主題的信息
return getTheme().getMessageSource().getMessage(code, null, defaultMessage, this.locale);
}
public Theme getTheme() {
//判斷主題是否為空
if (this.theme == null) {
// 通過(guò) RequestContextUtils 獲取 request 中的主題名
this.theme = RequestContextUtils.getTheme(this.request);
if (this.theme == null) { //如果還是為空的話
//那就是沒(méi)有有效的主題解析器和主題
this.theme = getFallbackTheme();
}
}
return this.theme;
}
RequestContextUtils.getTheme() 方法:
public static Theme getTheme(HttpServletRequest request) {
ThemeResolver themeResolver = getThemeResolver(request);
ThemeSource themeSource = getThemeSource(request);
if (themeResolver != null && themeSource != null) {
String themeName = themeResolver.resolveThemeName(request);
return themeSource.getTheme(themeName);
}
else {
return null;
}
}
MultipartResolver
用于處理上傳請(qǐng)求,處理方法:將普通的 request 包裝成 MultipartHttpServletRequest
public interface MultipartResolver {
//根據(jù) request 判斷是否是上傳請(qǐng)求
boolean isMultipart(HttpServletRequest request);
//將 request 包裝成 MultipartHttpServletRequest
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
//清理上傳過(guò)程中產(chǎn)生的臨時(shí)資源
void cleanupMultipart(MultipartHttpServletRequest request);
}
FlashMapManager
FlashMap 主要在 redirect 中傳遞參數(shù),F(xiàn)lashMapManager 用來(lái)管理 FlashMap 的。
public interface FlashMapManager {
//恢復(fù)參數(shù),并將恢復(fù)過(guò)的和超時(shí)的參數(shù)從保存介質(zhì)中刪除
@Nullable
FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response);
//將參數(shù)保存起來(lái)
void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response);
}
介紹 Spring MVC 中九大組件的接口、作用、內(nèi)部方法實(shí)現(xiàn)及作用進(jìn)行了簡(jiǎn)單的介紹,詳細(xì)的還需大家自己去看源碼。
本質(zhì)是一個(gè) Servlet,這個(gè) Servlet 繼承自 HttpServlet。Spring MVC 中提供了三個(gè)層次的 Servlet:HttpServletBean、FrameworkServlet 和 DispatcherServlet。他們相互繼承, HttpServletBean 直接繼承自 Java 的 HttpServlet。HttpServletBean 用于將 Servlet 中的 Servlet 中配置的參數(shù)設(shè)置到相應(yīng)的屬性中,F(xiàn)rameworkServlet 初始化了 Spring MVC 中所使用的 WebApplicationContext,具體處理請(qǐng)求的 9 大組件是在 DispatcherServlet 中初始化的,整個(gè)繼承圖如下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。