文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringMVC ViewResolver视图解析器组件怎么用

2023-07-05 23:51

关注

本篇内容主要讲解“SpringMVC ViewResolver视图解析器组件怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringMVC ViewResolver视图解析器组件怎么用”吧!

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

作用

在 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 方法实现如下:

@Overridepublic 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 属性将逻辑视图名称转换为物理视图名称。

到此,相信大家对“SpringMVC ViewResolver视图解析器组件怎么用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯