最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC ViewResolver視圖解析器組件

 更新時(shí)間:2023年04月10日 11:25:42   作者:這堆干貨有點(diǎn)猛  
這篇文章主要介紹了SpringMVC ViewResolver視圖解析器組件,Spring MVC的視圖解析器 ViewResolver 是框架中一個(gè)重要的組件,用于將控制器返回的邏輯視圖名稱(chēng)解析為具體的視圖實(shí)現(xiàn)對(duì)象,最終呈現(xiàn)給用戶(hù)的是具體的視圖實(shí)現(xiàn)

Spring MVC的視圖解析器 ViewResolver 是框架中一個(gè)重要的組件,用于將控制器返回的邏輯視圖名稱(chēng)解析為具體的視圖實(shí)現(xiàn)對(duì)象,最終呈現(xiàn)給用戶(hù)的是具體的視圖實(shí)現(xiàn),例如 JSP、FreeMarker 模板、Thymeleaf 模板、JSON 等等。本文將介紹 Spring MVC 的視圖解析器的作用、類(lèi)型、以及源碼實(shí)現(xiàn)。

作用

在 Spring MVC 中,控制器處理完請(qǐng)求之后需要將生成的模型數(shù)據(jù)和視圖名稱(chēng)返回給 DispatcherServlet,DispatcherServlet 會(huì)將模型數(shù)據(jù)和視圖名稱(chēng)交給 ViewResolver 進(jìn)行解析,ViewResolver 將對(duì)應(yīng)的視圖解析出來(lái),并返回給 DispatcherServlet,由 DispatcherServlet 進(jìn)行渲染,最終將渲染后的結(jié)果返回給客戶(hù)端。因此,ViewResolver 的作用是將控制器返回的邏輯視圖名稱(chēng)解析為具體的視圖實(shí)現(xiàn)對(duì)象。

類(lèi)型

Spring MVC 中提供了多種 ViewResolver 類(lèi)型,不同類(lèi)型的 ViewResolver 會(huì)使用不同的解析策略和算法,下面介紹幾種常見(jiàn)的 ViewResolver 類(lèi)型。

InternalResourceViewResolver

InternalResourceViewResolver 是 Spring MVC 中最常用的視圖解析器,它用于解析 JS P或 HTML 等資源文件。該解析器會(huì)將邏輯視圖名稱(chēng)加上前綴和后綴,例如將邏輯視圖名稱(chēng) “hello” 解析為 “/WEB-INF/views/hello.jsp”。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

FreeMarkerViewResolver

FreeMarkerViewResolver 用于解析FreeMarker 模板,它會(huì)將邏輯視圖名稱(chēng)加上前綴和后綴,例如將邏輯視圖名稱(chēng) “hello” 解析為 “/WEB-INF/views/hello.ftl”。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
    @Bean
    public FreeMarkerViewResolver viewResolver() {
        FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".ftl");
        return viewResolver;
    }
}

TilesViewResolver

TilesViewResolver 用于解析 Tiles 布局,它會(huì)將邏輯視圖名稱(chēng)解析為 Tiles 布局,并返回給 DispatcherServlet 進(jìn)行渲染。Tiles 是一個(gè)基于模板的布局框架,可以將頁(yè)面分成多個(gè)部分,每個(gè)部分都是一個(gè)獨(dú)立的模板,最終組合成一個(gè)完整的頁(yè)面。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions(new String[] { "/WEB-INF/tiles.xml" });
        return tilesConfigurer;
    }
    @Bean
    public TilesViewResolver viewResolver() {
        TilesViewResolver viewResolver = new TilesViewResolver();
        return viewResolver;
    }
}

ContentNegotiatingViewResolver

ContentNegotiatingViewResolver 是一個(gè)復(fù)合視圖解析器,它可以根據(jù)請(qǐng)求的 Accept 頭信息來(lái)判斷客戶(hù)端需要的數(shù)據(jù)類(lèi)型,并選擇對(duì)應(yīng)的視圖解析器進(jìn)行解析。例如客戶(hù)端請(qǐng)求的 Accept 頭信息為 “application/json”,則選擇使用 MappingJackson2JsonView 解析器將模型數(shù)據(jù)渲染成 JSON 格式返回給客戶(hù)端。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
    @Bean
    public ContentNegotiatingViewResolver viewResolver() {
        ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
        List<ViewResolver> viewResolvers = new ArrayList<>();
        viewResolvers.add(jsonViewResolver());
        viewResolver.setViewResolvers(viewResolvers);
        return viewResolver;
    }
    @Bean
    public MappingJackson2JsonViewResolver jsonViewResolver() {
        MappingJackson2JsonViewResolver jsonViewResolver = new MappingJackson2JsonViewResolver();
        return jsonViewResolver;
    }
}

源碼實(shí)現(xiàn)

Spring MVC 中的視圖解析器是通過(guò) ViewResolver 接口來(lái)實(shí)現(xiàn)的,該接口定義了兩個(gè)方法:

public interface ViewResolver {
    View resolveViewName(String viewName, Locale locale) throws Exception;
    String REDIRECT_URL_PREFIX = "redirect:";
    String FORWARD_URL_PREFIX = "forward:";
}

其中,resolveViewName 方法接收一個(gè)邏輯視圖名稱(chēng)和一個(gè) Locale 對(duì)象作為參數(shù),返回一個(gè) View 對(duì)象。如果找不到對(duì)應(yīng)的 View 對(duì)象,則返回 null。

對(duì)于 InternalResourceViewResolver 而言,它的 resolveViewName 方法實(shí)現(xiàn)如下:

@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
    String prefix = getPrefix();
    String suffix = getSuffix();
    if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
        String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
        RedirectView redirectView = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());
        String[] hosts = StringUtils.toStringArray(getRedirectHosts());
        if (hosts.length > 0) {
            redirectView.setHosts(hosts);
        }
        return redirectView;
    }
    if (viewName.startsWith(FORWARD_URL_PREFIX)) {
        String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
        InternalResourceView forwardView = new InternalResourceView(forwardUrl);
        forwardView.setApplicationContext(getApplicationContext());
        forwardView.setServletContext(getServletContext());
        forwardView.setAttributesMap(getAttributesMap());
        return forwardView;
    }
    if (!viewName.startsWith(prefix) && !viewName.endsWith(suffix)) {
        viewName = prefix + viewName + suffix;
    }
    return buildView(viewName);
}

在上面的代碼中

首先判斷邏輯視圖名稱(chēng)是否以 redirect: 或 forward: 開(kāi)頭,如果是就返回 RedirectView 或 InternalResourceView 對(duì)象。

如果不是,則根據(jù) prefix 和 suffix 屬性將邏輯視圖名稱(chēng)轉(zhuǎn)換為物理視圖名稱(chēng)。

總結(jié)

Spring MVC 的視圖解析器 ViewResolver 是一個(gè)重要的組件,它將控制器返回的邏輯視圖名稱(chēng)解析為具體的視圖實(shí)現(xiàn)對(duì)象,最終呈現(xiàn)給用戶(hù)的是具體的視圖實(shí)現(xiàn)。

Spring MVC提供了多種 ViewResolver 類(lèi)型,不同類(lèi)型的ViewResolver會(huì)使用不同的解析策略和算法,例如 InternalResourceViewResolver 用于解析JSP或HTML等資源文件,F(xiàn)reeMarkerViewResolver 用于解析 FreeMarker 模板,TilesViewResolver 用于解析 Tiles 布局,ContentNegotiatingViewResolver 則是一個(gè)復(fù)合視圖解析器,可以根據(jù)請(qǐng)求的 Accept 頭信息來(lái)選擇對(duì)應(yīng)的視圖解析器進(jìn)行解析。

ViewResolver 的源碼實(shí)現(xiàn)遵循了 ViewResolver 接口的規(guī)范,即將邏輯視圖名稱(chēng)解析為具體的視圖實(shí)現(xiàn)對(duì)象。

到此這篇關(guān)于SpringMVC ViewResolver視圖解析器組件的文章就介紹到這了,更多相關(guān)SpringMVC ViewResolver內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 啟用設(shè)置org.slf4j.Logger打印并輸出日志方式

    啟用設(shè)置org.slf4j.Logger打印并輸出日志方式

    這篇文章主要介紹了啟用設(shè)置org.slf4j.Logger打印并輸出日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Dependency ‘XXX:‘ not found問(wèn)題的三步解決

    Dependency ‘XXX:‘ not found問(wèn)題的三步解決

    這篇文章主要介紹了Dependency ‘XXX:‘ not found問(wèn)題的三步解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 淺談Spring bean 生命周期驗(yàn)證

    淺談Spring bean 生命周期驗(yàn)證

    本篇文章主要介紹了淺談Spring bean 生命周期驗(yàn)證,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器的方式

    這篇文章主要介紹了springboot+jersey+tomcat實(shí)現(xiàn)跨域方式上傳文件到服務(wù)器,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java實(shí)現(xiàn)短信驗(yàn)證碼詳細(xì)過(guò)程

    Java實(shí)現(xiàn)短信驗(yàn)證碼詳細(xì)過(guò)程

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)短信驗(yàn)證碼的相關(guān)資料, 在業(yè)務(wù)需求中我們經(jīng)常會(huì)用到短信驗(yàn)證碼,比如手機(jī)號(hào)登錄、綁定手機(jī)號(hào)、忘記密碼、敏感操作等,需要的朋友可以參考下
    2023-09-09
  • easyExcel分批導(dǎo)入文件方式

    easyExcel分批導(dǎo)入文件方式

    這篇文章主要介紹了easyExcel分批導(dǎo)入文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法示例

    Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法,結(jié)合實(shí)例形式分析了spring方法級(jí)別緩存配置、屬性文件、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • Spring中的@DependsOn注解使用解析

    Spring中的@DependsOn注解使用解析

    這篇文章主要介紹了Spring中的@DependsOn注解使用解析,@DependsOn注解可以定義在類(lèi)和方法上,意思是我這個(gè)組件要依賴(lài)于另一個(gè)組件,也就是說(shuō)被依賴(lài)的組件會(huì)比該組件先注冊(cè)到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    Spring Boot是一種流行的Java開(kāi)發(fā)框架,它提供了許多方便的功能來(lái)簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)和部署,這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載,需要的朋友可以參考下
    2023-09-09
  • Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例

    Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例

    這篇文章主要介紹了Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例,DelayQueue是一個(gè)延遲隊(duì)列,插入隊(duì)列的數(shù)據(jù)只有達(dá)到設(shè)置的延遲時(shí)間時(shí)才能被取出,否則線程會(huì)被阻塞,插入隊(duì)列的對(duì)象必須實(shí)現(xiàn)Delayed接口,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

榆社县| 新邵县| 泸州市| 牡丹江市| 合川市| 五台县| 蒲城县| 金堂县| 辽阳县| 炎陵县| 扶余县| 阿鲁科尔沁旗| 酒泉市| 无为县| 荥阳市| 进贤县| 仙居县| 林周县| 南木林县| 江津市| 冷水江市| 宝丰县| 高清| 芦山县| 博野县| 崇阳县| 呈贡县| 固原市| 利辛县| 福清市| 简阳市| 太康县| 舟曲县| 准格尔旗| 分宜县| 永善县| 金乡县| 兰考县| 德保县| 屏东县| 嘉鱼县|