成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

SpringMVC之源碼分析--View(一)

jerryloveemily / 2683人閱讀

摘要:概述通過(guò)上幾章的介紹知道了的作用,即就是把返回的邏輯視圖名稱(chēng)解析為視圖對(duì)象。進(jìn)而通過(guò)對(duì)象的視圖渲染把最終的結(jié)果展現(xiàn)給用戶(hù)。運(yùn)用模板技術(shù)把數(shù)據(jù)和視圖分開(kāi),同時(shí)提供支持很多的模板技術(shù),比如等等。

概述

通過(guò)上幾章的介紹知道了ViewResolver的作用,即ViewResolver就是把handler返回的邏輯視圖名稱(chēng)解析為視圖View對(duì)象。進(jìn)而通過(guò)View對(duì)象的視圖渲染把最終的結(jié)果展現(xiàn)給用戶(hù)。

View視圖渲染的原理,簡(jiǎn)單說(shuō)就是把模型數(shù)據(jù)填充到視圖模板,最終交由Servlet的response進(jìn)行渲染展示。

Spring MVC運(yùn)用模板技術(shù)把數(shù)據(jù)和視圖分開(kāi),同時(shí)提供支持很多的模板技術(shù),比如:InternalResourceView(JstlView)、FreeMarkerView、Thymeleaf等等。

本系列文章是基于Spring5.0.5RELEASE。

源碼分析

以InternalResourceView為例進(jìn)行分析,該類(lèi)解析jsp視圖模板,主要涉及類(lèi)和接口如下:

View

View接口是Spring MVC提供的視圖渲染接口,定義了render方法對(duì)給定的模型數(shù)據(jù)進(jìn)行視圖渲染,源碼如下:

public interface View {
    ... ...
    /** 把模型數(shù)據(jù)進(jìn)行渲染 */
    void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response)
        throws Exception;
    ... ...
}

AbstractView

AbstractView是實(shí)現(xiàn)View接口的抽象類(lèi),實(shí)現(xiàn)了render方法,源碼如下:

public abstract class AbstractView extends WebApplicationObjectSupport implements View, BeanNameAware {
    ... ...
    @Override
    public void render(@Nullable Map model, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        if (logger.isTraceEnabled()) {
            logger.trace("Rendering view with name "" + this.beanName + "" with model " + model +
                " and static attributes " + this.staticAttributes);
        }
        
        // 創(chuàng)建整合后需要返回給瀏覽器的Model
        Map mergedModel = createMergedOutputModel(model, request, response);
        // 設(shè)置response 報(bào)文頭
        prepareResponse(request, response);
        // 渲染數(shù)據(jù),通過(guò)模板方法由子類(lèi)實(shí)現(xiàn),如InternalResourceView
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
    }
    ... ...
}

InternalResourceView

該類(lèi)繼承自AbstractView,并實(shí)現(xiàn)renderMergedOutputModel方法,源碼如下:

@Override
protected void renderMergedOutputModel(
        Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {

    // 將model中的數(shù)據(jù)設(shè)置到request
    exposeModelAsRequestAttributes(model, request);

    // 本類(lèi)中的此函數(shù)是空函數(shù),留給子類(lèi)比如JstlView去實(shí)現(xiàn)自定義邏輯
    exposeHelpers(request);

    // 跳轉(zhuǎn)目的頁(yè)面路徑
    String dispatcherPath = prepareForRendering(request, response);

    // 獲取跳轉(zhuǎn)控制器RequestDispatcher  
    RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);
    if (rd == null) {
        throw new ServletException("Could not get RequestDispatcher for [" + getUrl() +
                "]: Check that the corresponding file exists within your web application archive!");
    }

    // 直接返回用戶(hù)資源 
    if (useInclude(request, response)) {
        response.setContentType(getContentType());
        if (logger.isDebugEnabled()) {
            logger.debug("Including resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """);
        }
        rd.include(request, response);
    }
    // 攜帶request和response跳轉(zhuǎn)到另一個(gè)控制器方法
    else {
        // Note: The forwarded resource is supposed to determine the content type itself.
        if (logger.isDebugEnabled()) {
            logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """);
        }
        rd.forward(request, response);
    }
}

至此,View渲染視圖的大致流程結(jié)束,也就是Spring MVC基本完成了整個(gè)流程,剩下的渲染工作交由Servlet去處理。

總結(jié)

本章就View視圖渲染進(jìn)行了簡(jiǎn)單的分析,Spring 提供了眾多的View實(shí)現(xiàn),有興趣的童鞋可以繼續(xù)了解。

最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時(shí)也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69732.html

相關(guān)文章

  • SpringMVC源碼分析--ViewResolver(三)

    摘要:概述本節(jié)學(xué)習(xí)下的功能,簡(jiǎn)單來(lái)說(shuō),該類(lèi)的作用就是把多個(gè)視圖解析器進(jìn)行組裝,內(nèi)部使用存儲(chǔ)配置使用的視圖解析器??偨Y(jié)本章介紹了類(lèi),根據(jù)測(cè)試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡(jiǎn)單來(lái)說(shuō),該類(lèi)的作用就是把多個(gè)ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲(chǔ)配置使用的視圖解析器。 本系列文章是基于Spri...

    fox_soyoung 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(二)

    摘要:概述上篇學(xué)習(xí)了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見(jiàn)下圖本系列文章是基于。該視圖解析器是根據(jù)處理器返回的邏輯視圖名稱(chēng),在應(yīng)用上下文中查找該名稱(chēng)的視圖對(duì)象視圖對(duì)象就是的對(duì)象。 概述 上篇學(xué)習(xí)了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見(jiàn)下圖):showImg(https://segmentfault...

    jas0n 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(

    摘要:概述本章開(kāi)始進(jìn)入另一重要的組件,即視圖組件,處理視圖組件使用兩個(gè)主要的接口是和。接口的作用是用于處理視圖進(jìn)行渲染。延用之前的介紹流程,本章分兩部分進(jìn)行闡述啟動(dòng)初始化和請(qǐng)求處理。 概述 本章開(kāi)始進(jìn)入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個(gè)主要的接口是ViewResolver和View。根據(jù)名稱(chēng)可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱(chēng)解...

    pf_miles 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(五)

    摘要:此解析器與差不多,更改下配置文件中的類(lèi)全路徑即可??偨Y(jié)本章介紹了以及三個(gè)視圖解析器。這部分內(nèi)容有點(diǎn)兒多,我會(huì)盡快結(jié)束。 概述 通過(guò)上幾篇的學(xué)習(xí),我們分析了并試驗(yàn)了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,這三個(gè)類(lèi)都直接實(shí)現(xiàn)ViewResolver接口。Spring MVC提供了很多...

    klinson 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(四)

    摘要:概述本章繼續(xù)學(xué)習(xí)另一個(gè)實(shí)現(xiàn)類(lèi)解析器,該類(lèi)的主要作用是根據(jù)同一請(qǐng)求的某些策略,選擇對(duì)應(yīng)的進(jìn)行渲染??梢园牙斫鉃檫m配器,對(duì)不同類(lèi)型進(jìn)行適配。值得注意的是處理的為同一個(gè)。本系列文章是基于。實(shí)戰(zhàn)需求目標(biāo)實(shí)現(xiàn)后綴名或參數(shù)控制,顯示不同的視圖。 概述 本章繼續(xù)學(xué)習(xí)ViewResolver另一個(gè)實(shí)現(xiàn)類(lèi)ContentNegotiatingViewResolver解析器,該類(lèi)的主要作用是根據(jù)同一請(qǐng)求的某...

    jcc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<