SpringMVC ViewResolver视图解析器组件

 更新时间:2023年04月10日 11:25:42   作者:这堆干货有点猛  
这篇文章主要介绍了SpringMVC ViewResolver视图解析器组件,Spring MVC的视图解析器 ViewResolver 是框架中一个重要的组件,用于将控制器返回的逻辑视图名称解析为具体的视图实现对象,最终呈现给用户的是具体的视图实现

Spring MVC的视图解析器 ViewResolver 是框架中一个重要的组件,用于将控制器返回的逻辑视图名称解析为具体的视图实现对象,最终呈现给用户的是具体的视图实现,例如 JSP、FreeMarker 模板、Thymeleaf 模板、JSON 等等。本文将介绍 Spring MVC 的视图解析器的作用、类型、以及源码实现。

作用

在 Spring MVC 中,控制器处理完请求之后需要将生成的模型数据和视图名称返回给 DispatcherServlet,DispatcherServlet 会将模型数据和视图名称交给 ViewResolver 进行解析,ViewResolver 将对应的视图解析出来,并返回给 DispatcherServlet,由 DispatcherServlet 进行渲染,最终将渲染后的结果返回给客户端。因此,ViewResolver 的作用是将控制器返回的逻辑视图名称解析为具体的视图实现对象。

类型

Spring MVC 中提供了多种 ViewResolver 类型,不同类型的 ViewResolver 会使用不同的解析策略和算法,下面介绍几种常见的 ViewResolver 类型。

InternalResourceViewResolver

InternalResourceViewResolver 是 Spring MVC 中最常用的视图解析器,它用于解析 JS P或 HTML 等资源文件。该解析器会将逻辑视图名称加上前缀和后缀,例如将逻辑视图名称 “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 模板,它会将逻辑视图名称加上前缀和后缀,例如将逻辑视图名称 “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 布局,它会将逻辑视图名称解析为 Tiles 布局,并返回给 DispatcherServlet 进行渲染。Tiles 是一个基于模板的布局框架,可以将页面分成多个部分,每个部分都是一个独立的模板,最终组合成一个完整的页面。

@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 是一个复合视图解析器,它可以根据请求的 Accept 头信息来判断客户端需要的数据类型,并选择对应的视图解析器进行解析。例如客户端请求的 Accept 头信息为 “application/json”,则选择使用 MappingJackson2JsonView 解析器将模型数据渲染成 JSON 格式返回给客户端。

@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;
    }
}

源码实现

Spring MVC 中的视图解析器是通过 ViewResolver 接口来实现的,该接口定义了两个方法:

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

其中,resolveViewName 方法接收一个逻辑视图名称和一个 Locale 对象作为参数,返回一个 View 对象。如果找不到对应的 View 对象,则返回 null。

对于 InternalResourceViewResolver 而言,它的 resolveViewName 方法实现如下:

@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);
}

在上面的代码中

首先判断逻辑视图名称是否以 redirect: 或 forward: 开头,如果是就返回 RedirectView 或 InternalResourceView 对象。

如果不是,则根据 prefix 和 suffix 属性将逻辑视图名称转换为物理视图名称。

总结

Spring MVC 的视图解析器 ViewResolver 是一个重要的组件,它将控制器返回的逻辑视图名称解析为具体的视图实现对象,最终呈现给用户的是具体的视图实现。

Spring MVC提供了多种 ViewResolver 类型,不同类型的ViewResolver会使用不同的解析策略和算法,例如 InternalResourceViewResolver 用于解析JSP或HTML等资源文件,FreeMarkerViewResolver 用于解析 FreeMarker 模板,TilesViewResolver 用于解析 Tiles 布局,ContentNegotiatingViewResolver 则是一个复合视图解析器,可以根据请求的 Accept 头信息来选择对应的视图解析器进行解析。

ViewResolver 的源码实现遵循了 ViewResolver 接口的规范,即将逻辑视图名称解析为具体的视图实现对象。

到此这篇关于SpringMVC ViewResolver视图解析器组件的文章就介绍到这了,更多相关SpringMVC ViewResolver内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 启用设置org.slf4j.Logger打印并输出日志方式

    启用设置org.slf4j.Logger打印并输出日志方式

    这篇文章主要介绍了启用设置org.slf4j.Logger打印并输出日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Dependency ‘XXX:‘ not found问题的三步解决

    Dependency ‘XXX:‘ not found问题的三步解决

    这篇文章主要介绍了Dependency ‘XXX:‘ not found问题的三步解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 浅谈Spring bean 生命周期验证

    浅谈Spring bean 生命周期验证

    本篇文章主要介绍了浅谈Spring bean 生命周期验证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • springboot+jersey+tomcat实现跨域方式上传文件到服务器的方式

    springboot+jersey+tomcat实现跨域方式上传文件到服务器的方式

    这篇文章主要介绍了springboot+jersey+tomcat实现跨域方式上传文件到服务器,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java实现短信验证码详细过程

    Java实现短信验证码详细过程

    这篇文章主要给大家介绍了关于Java实现短信验证码的相关资料, 在业务需求中我们经常会用到短信验证码,比如手机号登录、绑定手机号、忘记密码、敏感操作等,需要的朋友可以参考下
    2023-09-09
  • easyExcel分批导入文件方式

    easyExcel分批导入文件方式

    这篇文章主要介绍了easyExcel分批导入文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Spring实战之方法级别缓存用法示例

    Spring实战之方法级别缓存用法示例

    这篇文章主要介绍了Spring实战之方法级别缓存用法,结合实例形式分析了spring方法级别缓存配置、属性文件、领域模型及相关使用技巧,需要的朋友可以参考下
    2020-01-01
  • Spring中的@DependsOn注解使用解析

    Spring中的@DependsOn注解使用解析

    这篇文章主要介绍了Spring中的@DependsOn注解使用解析,@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中,需要的朋友可以参考下
    2024-01-01
  • SpringBoot项目启动时预加载操作方法

    SpringBoot项目启动时预加载操作方法

    Spring Boot是一种流行的Java开发框架,它提供了许多方便的功能来简化应用程序的开发和部署,这篇文章主要介绍了SpringBoot项目启动时预加载,需要的朋友可以参考下
    2023-09-09
  • Java的DelayQueue延迟队列简单使用代码实例

    Java的DelayQueue延迟队列简单使用代码实例

    这篇文章主要介绍了Java的DelayQueue延迟队列简单使用代码实例,DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞,插入队列的对象必须实现Delayed接口,需要的朋友可以参考下
    2023-12-12

最新评论