Spring MVC 视图解析器(JSP、Thymeleaf、Freemarker、 JSON/HTML、Bean)详解

Spring MVC 视图解析器详解


1. 视图解析器概述

视图解析器(ViewResolver)是 Spring MVC 的核心组件,负责将控制器返回的视图名称(如 success)转换为具体的 View 对象(如 Thymeleaf 模板或 JSP 文件)。Spring 提供了多种视图解析器,支持不同的模板引擎和渲染方式。


2. 常用视图解析器详解

1. InternalResourceViewResolver

作用:解析 JSP 或其他服务器端包含(JSP/Servlet)的视图,默认用于传统 JSP 开发

配置方式

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic InternalResourceViewResolver internalResourceViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/"); // 视图文件路径前缀resolver.setSuffix(".jsp");            // 视图文件后缀resolver.setOrder(1);                  // 设置优先级(数值越小优先级越高)return resolver;}
}

使用示例

@Controller
public class MyController {@GetMapping("/jsp")public String jspView() {return "hello"; // 实际路径:/WEB-INF/views/hello.jsp}
}

2. ThymeleafViewResolver

作用:解析 Thymeleaf 模板文件,需配合 Thymeleaf 依赖。

依赖:需添加 Thymeleaf 依赖:

<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>
</dependency>

配置方式

@Configuration
public class ThymeleafConfig {@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine engine = new SpringTemplateEngine();engine.setTemplateResolver(templateResolver());return engine;}@Beanpublic SpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();resolver.setPrefix("classpath:/templates/"); // 模板文件路径resolver.setSuffix(".html");resolver.setTemplateMode("HTML5");return resolver;}@Beanpublic ThymeleafViewResolver thymeleafViewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());resolver.setCharacterEncoding("UTF-8");resolver.setOrder(0); // 设置优先级return resolver;}
}

使用示例

@Controller
public class MyController {@GetMapping("/thymeleaf")public String thymeleafView() {return "hello"; // 实际路径:src/main/resources/templates/hello.html}
}

3. FreeMarkerViewResolver

作用:解析 FreeMarker 模板文件。

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

配置方式(Spring Boot 自动配置):

# application.properties
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftl

使用示例

@Controller
public class MyController {@GetMapping("/freemarker")public String freemarkerView() {return "hello"; // 实际路径:src/main/resources/templates/hello.ftl}
}

4. ContentNegotiatingViewResolver

作用:根据请求的 Accept 头或扩展名动态选择视图解析器,常用于 RESTful API 多媒体格式支持

配置方式

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic ContentNegotiatingViewResolver contentNegotiatingViewResolver() {ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();List<ViewResolver> resolvers = new ArrayList<>();resolvers.add(new InternalResourceViewResolver()); // JSPresolvers.add(new ThymeleafViewResolver());        // Thymeleafresolver.setViewResolvers(resolvers);return resolver;}
}

使用场景

  • 请求 /api/data.json → 返回 JSON 格式。
  • 请求 /api/data.html → 返回 HTML 模板。

5. BeanNameViewResolver

作用:根据视图名称直接查找 BeanFactory 中的 View Bean,无需配置前缀/后缀

配置示例

@Bean
public View myView() {InternalResourceView view = new InternalResourceView();view.setUrl("/WEB-INF/views/custom.jsp");return view;
}@Bean
public BeanNameViewResolver beanNameViewResolver() {BeanNameViewResolver resolver = new BeanNameViewResolver();resolver.setOrder(2); // 优先级最低return resolver;
}

使用示例

@Controller
public class MyController {@GetMapping("/bean")public String beanView() {return "myView"; // 直接匹配 Bean 名称}
}

3. 核心属性说明

视图解析器的通用属性:

属性说明示例
prefix视图文件的路径前缀(如 /WEB-INF/views/)。resolver.setPrefix("/templates/")
suffix视图文件的后缀(如 .jsp, .html)。resolver.setSuffix(".ftl")
order优先级(数值越小优先级越高)。resolver.setOrder(0)
viewClass指定视图实现类(如 InternalResourceView)。resolver.setViewClass(ThymeleafView.class)

4. 视图解析流程
  1. 请求处理:控制器方法返回视图名称(如 success)。
  2. 解析匹配:Spring 按 order 从小到大顺序调用视图解析器。
  3. 生成 View:第一个匹配的解析器将名称转换为具体 View 对象(如 Thymeleaf 模板)。
  4. 渲染响应View 对象填充数据并生成最终 HTML。

5. 总结表格
视图解析器适用场景核心配置属性
InternalResourceViewResolverJSP 或传统 Servlet 开发prefix, suffix, viewClass = InternalResourceView
ThymeleafViewResolverThymeleaf 模板开发templateResolver, templateEngine
FreeMarkerViewResolverFreeMarker 模板开发prefix, suffix
ContentNegotiatingViewResolver动态选择视图格式(如 JSON/HTML)viewResolvers(集合其他解析器)
BeanNameViewResolver直接绑定 Bean 名称到 Vieworder(通常最低优先级)

6. 常见问题与解决方案
  • 视图文件找不到
    • 检查 prefix/suffix 配置是否正确。
    • 确认视图文件路径(如 src/main/resources/templates)。
  • 多个解析器冲突
    • 通过 order 属性调整优先级。
    • 确保不同解析器的 prefix 不重叠。
  • Thymeleaf/Freemarker 配置失败
    • 添加对应依赖并检查模板引擎配置(如 templateResolver)。

关键总结

  1. 选择解析器:根据项目使用的模板引擎(如 Thymeleaf、FreeMarker)选择对应解析器。
  2. 配置优先级:通过 order 确定解析器处理顺序,避免冲突。
  3. 路径规范:确保 prefix/suffix 正确指向视图文件位置。
  4. 混合使用:通过 ContentNegotiatingViewResolver 支持多格式响应(如 RESTful API)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# 爬虫技术的实现

手把手教你网络爬虫&#xff1a;从入门到实践 一、网络爬虫简介 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化获取互联网数据的程序&#xff0c;广泛应用于搜索引擎、数据分析、市场调研等领域。通过模拟浏览器行为&#xff0c;爬虫可以高效地从网页中提取结构化…

【HarmonyOS 5】鸿蒙中@State的原理详解

一、State在鸿蒙中是做什么的&#xff1f; State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器&#xff0c;其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 State&#xff0c;开发者可以确保当状态值发生变化时&#xff0c;依赖该状态的 UI 组件…

influxdb数据导出笔记

influx query ‘from(bucket: “byt-grid-data”) |> range(start: 2025-04-01T00:00:00Z, stop: 2025-04-02T23:59:59Z) |> filter(fn: > r[“_measurement”] “byt-gzsn-hsxn-sc-dcs”) |> filter(fn: > r[“_field”] “F_ACT_FZZ02_FB_O”) |> filt…

HTTP Content-Type:深入解析与应用

HTTP Content-Type:深入解析与应用 引言 在互联网世界中,数据传输是至关重要的。而HTTP协议作为最常用的网络协议之一,其在数据传输过程中扮演着关键角色。其中,HTTP Content-Type头字段在数据传输中发挥着至关重要的作用。本文将深入解析HTTP Content-Type,并探讨其在实…

使用SQL查询ES数据

使用SQL查询ES数据 32 进阶&#xff1a;使用SQL查询ES数据环境准备利用脚本导入测试数据 SQL学习基本查询排序查询过滤查询范围查询分组查询(group)分组过滤查询(grouphaving)聚合函数统计limit查询分页查询 32 进阶&#xff1a;使用SQL查询ES数据 环境准备 需要首先安装ES8.…

禁止页面滚动的方法-微信小程序

在微信小程序中&#xff0c;有几种方法可以禁止页面滚动&#xff1a; 一、通过页面配置禁止滚动 在页面的JSON配置文件中设置&#xff0c;此方法完全禁止页面的滚动行为&#xff1a; {"disableScroll": true }二、通过 CSS 样式禁止滚动 在页面的WXSS文件中添加&…

用户画像(https://github.com/memodb-io/memobase)应用

1.下载项目的源代码,我们要先启动后端,用docker启动 cd src/server cp .env.example .env cp ./api/config.yaml.example ./api/config.yaml 这里我的配置内容如下config.yaml(因为我是调用的符合openai格式的大模型,所以我没改,如果要是别的大模型的话,需要自己再做兼容…

微信小程序生成某个具体页面的二维码

微信小程序&#xff0c;如果要生成某个具体页面&#xff0c;而非首页的二维码&#xff0c;体验和正式的生成方法如下&#xff1a; 1、体验版二维码&#xff1a; 管理---版本管理---修改页面路径&#xff0c;输入具体页面的路径以及参数&#xff0c;生成的是二维码 2、正式小程…

【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 小乐乐改数字 (模拟)十字爆破 (预处理模拟&#xff09;比那名居的桃子 (滑窗 / 前缀和) 小乐乐改数字 (模拟) 小乐乐改数字…

四旋翼无人机手动模式

无人机的手动模式&#xff08;Manual Mode&#xff09;是指飞手完全通过遥控器手动控制无人机的飞行姿态、高度、方向和速度&#xff0c;‌无需依赖自动稳定系统或辅助功能‌&#xff08;如GPS定位、气压计定高、视觉避障等&#xff09;。这种模式赋予操作者最大的操控自由度&a…

C++高精度算法(加、减、乘)

首先声明&#xff0c;没有除法是因为我不会&#xff08;手动狗头_doge&#xff09; 简介 顾名思义&#xff0c;高精度算法是用来算一些超级大的数&#xff0c;比如长到 longlong 都存不下的那种&#xff0c;还有就是小数点后好多位&#xff0c;double都存不下的那种&#xff…

思科交换机配置

以下是交换机配置的详细步骤指南&#xff0c;适用于Cisco交换机&#xff0c;其他品牌需调整命令&#xff1a; 1. 初始连接与基本配置 连接方式&#xff1a;使用Console线连接交换机&#xff0c;通过终端软件&#xff08;如PuTTY&#xff09;登录。波特率&#xff1a;9600&…

数据质量问题中,数据及时性怎么保证?如何有深度体系化回答!

数据治理&#xff0c;数据质量这快是中大厂&#xff0c;高阶大数据开发面试必备技能&#xff0c;企业基于大数据底座去做数仓&#xff0c;那么首先需要保障的就是数据质量。 数据质量的重要性在现代企业中变得越发突出。以下是数据质量的几个关键方面&#xff0c;说明其对企业…

【学习笔记】CPU 的“超线程”是什么?

1. 什么是超线程&#xff1f; 超线程&#xff08;Hyper-Threading&#xff09;是Intel的技术&#xff0c;让一个物理CPU核心模拟出两个逻辑核心。 效果&#xff1a;4核CPU在系统中显示为8线程。 本质&#xff1a;通过复用空闲的硬件单元&#xff08;如ALU、FPU&#xff09;&a…

闭包的理解

一、闭包的概念 当通过调用外部函数返回的内部函数后&#xff0c;即使外部函数已经执行结束了&#xff0c;但是被内部函数引用的外部函数的变量依然会保存在内存中&#xff0c;我们把引用了其他函数作用域变量的函数和这些被引用变量的集合&#xff0c;称为闭包&#xff08;Clo…

从小米汽车事故反思 LabVIEW 开发

近期&#xff0c;小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考&#xff0c;也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域&#xff0c;尤其是涉及到智能驾驶辅助系统时&#xff0c;安全是…

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因&#xff1a;目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中&#xff0c;需求频繁变更是导致延误的关键因素之一&…

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作 摘要: 数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。本文将结合真实案例,介绍如何利用 AI 优化 DBA 工作流…

vxe-table4.6 + vue3.2 + ant-design-vue 3.x 实现对列的显示、隐藏、排序

概要 vxe-table中的vxe-toolbar没有拖拽功能&#xff0c;故自己实现 源码 <template><a-popover v-model:visible"open" placement"bottomRight" trigger"click"><template #content><div class"content">…

c++基础知识二

1.面向对象 1.1 定义 面向对象编程是一种程序设计方法,它将数据和操作数据的方法封装在一起,形成类。类是一种用户自定义的数据类型,它包含了数据和对数据的操作方法。面向对象编程的特点包括封装、继承、多态 1.2 访问控制符 public 公有属性,方法。都可以访问 prot…