真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringMVC組件源碼分析

組件概覽

HandlerMapping

成都創(chuàng)新互聯(lián)公司專業(yè)提供成都主機(jī)托管四川主機(jī)托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價格,機(jī)房位于中國電信/網(wǎng)通/移動機(jī)房,成都服務(wù)器托管服務(wù)有保障!

根據(jù) request 找到對應(yīng)的處理器 Handler 和 Interceptors。內(nèi)部只有一個方法

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

HandlerAdapter

Handler 適配器,內(nèi)部方法如下:

boolean supports(Object handler);//判斷是否可以使用某個 Handler
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; //具體使用
long getLastModified(HttpServletRequest request, Object handler);//獲取資源上一次修改的時間

HandlerExceptionResolver

根據(jù)異常設(shè)置 ModelAndView ,再交給 render 方法進(jìn)行渲染。

ModelAndView resolveException(
            HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex)

ViewResolver

用來將 String 類型的視圖名和 Locale 解析為 View 類型的視圖。

View resolveViewName(String viewName, Locale locale) throws Exception;

它的一個實現(xiàn)類 BeanNameViewResolver,它重寫 resolveViewName 方法如下:

public View resolveViewName(String viewName, Locale locale) throws BeansException {
        ApplicationContext context = getApplicationContext();
        //如果應(yīng)用上下文沒有找到視圖,返回 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 中的視圖名。接口里面也是只有一個方法:

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 {
    //通過給定的 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) {
            // 通過 RequestContextUtils 獲取 request 中的主題名
            this.theme = RequestContextUtils.getTheme(this.request);
            if (this.theme == null) {   //如果還是為空的話
                //那就是沒有有效的主題解析器和主題
                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

用于處理上傳請求,處理方法:將普通的 request 包裝成 MultipartHttpServletRequest

public interface MultipartResolver {
    //根據(jù) request 判斷是否是上傳請求
    boolean isMultipart(HttpServletRequest request);
    //將 request 包裝成 MultipartHttpServletRequest
    MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
    //清理上傳過程中產(chǎn)生的臨時資源
    void cleanupMultipart(MultipartHttpServletRequest request);
}

FlashMapManager

FlashMap 主要在 redirect 中傳遞參數(shù),F(xiàn)lashMapManager 用來管理 FlashMap 的。

public interface FlashMapManager {
    //恢復(fù)參數(shù),并將恢復(fù)過的和超時的參數(shù)從保存介質(zhì)中刪除
    @Nullable
    FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response);
    //將參數(shù)保存起來
    void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response);
}

小結(jié)

介紹 Spring MVC 中九大組件的接口、作用、內(nèi)部方法實現(xiàn)及作用進(jìn)行了簡單的介紹,詳細(xì)的還需大家自己去看源碼。

總結(jié)

Spring MVC 原理總結(jié)

本質(zhì)是一個 Servlet,這個 Servlet 繼承自 HttpServlet。Spring MVC 中提供了三個層次的 Servlet:HttpServletBean、FrameworkServlet 和 DispatcherServlet。他們相互繼承, HttpServletBean 直接繼承自 Java 的 HttpServlet。HttpServletBean 用于將 Servlet 中的 Servlet 中配置的參數(shù)設(shè)置到相應(yīng)的屬性中,F(xiàn)rameworkServlet 初始化了 Spring MVC 中所使用的 WebApplicationContext,具體處理請求的 9 大組件是在 DispatcherServlet 中初始化的,整個繼承圖如下:

Spring MVC組件源碼分析


名稱欄目:SpringMVC組件源碼分析
文章網(wǎng)址:http://weahome.cn/article/gojcpe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部