当前位置: 首页 > news >正文

09_Spring Boot 整合 Freemarker 模板引擎的坑

09_Spring Boot 整合 Freemarker 模板引擎的坑

1.背景:

springboot 版本:3.0.2

2. 引入依赖

pom.xml 中添加:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Spring Boot Freemarker 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

3. 配置 freemarker

application.yml 中进行如下配置

spring:freemarker:cache: falsecharset: UTF-8check-template-location: truecontent-type: text/htmlexpose-request-attributes: trueexpose-session-attributes: truerequest-context-attribute: request

4. 编写控制层代码

  • 需要使用 @Controller,而非 @RestController
  • @Controller 用于返回视图页面,@RestController 会默认返回 JSON,不适合页面跳转。

示例:

@Controller
public class FreemarkerController {@GetMapping("/freemarker")public String freemarkerTest(Model model) {model.addAttribute("message", "Hello Freemarker!");return "freemarker"; // 视图名称,对应模板文件}
}

5. 模板文件位置与命名

  • Freemarker模板文件放置于 src/main/resources/templates/ 目录。
  • 即模板文件命名为 freemarker.ftl

目录结构示例:

src└─ main└─ resources└─ templates└─ freemarker.ftl

freemarker.ftl 模板内容如下:

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title>Freemarker</title>
</head>
<body>
</body>
</html>

6. 启动项目

启动后访问地址,并没有想象中的顺利,直接报错了。

第一次报错:404 错误

  • 可能是缓存或项目未正确构建导致。
  • 解决:执行 Maven clean,重新编译打包,再启动。

第二次报错:还是 404 错误

在这里插入图片描述

经过查询才知道,Spring Boot 2.2.0 起,默认模版后缀名为 ftlh

解决方案:
  • 将模板文件后缀由 .ftl 改为 .ftlh
  • 确认模板文件路径和名称与返回视图名一致。

例如:

templates/freemarker.ftlh

控制器返回:

return "freemarker"; // 自动匹配 freemarker.ftlh

templates/freemarker.ftlh

控制器返回:

return "freemarker"; // 自动匹配 freemarker.ftlh

Spring Boot 2.2.0 及以上版本 Freemarker 模板后缀名默认是 .ftlh,而不是传统的 .ftl

http://www.dtcms.com/a/290535.html

相关文章:

  • 【C++】stack和queue拓展学习
  • 库卡气体保护焊机器人省气的方法
  • Mac上安装Homebrew的详细步骤
  • 【CNN】卷积神经网络池化- part2
  • Pytorch01:深度学习中的专业名词及基本介绍
  • 有关Maven的个人笔记总结
  • Zetane:让深度学习不再抽象,一键3D可视化
  • SpringSecurity 详细介绍(认证和授权)
  • 直播专用域名租用全解析:开启直播新境界
  • 板凳-------Mysql cookbook学习 (十二--------3_2)
  • 基于 STM32 的数字闹钟系统 Proteus 仿真设计与实现
  • ASP .NET Core 8高效集成Redis缓存实战
  • C++中的deque容器
  • C#/.NET/.NET Core技术前沿周刊 | 第 47 期(2025年7.14-7.20)
  • 解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi
  • Hyperledger Fabric V2.5 生产环境部署及安装Java智能合约
  • 从0开始学习R语言--Day53--AFT模型
  • 什么是“差分“?
  • WebkitSpeechRecognition 语音识别
  • 【备忘录】Ubuntu 配置虚拟显示器
  • 嵌入式学习-土堆目标检测(1)-day26
  • 每日数据推荐:一线城市基于手机信令的职住数据
  • 主流监控设备RTSP地址
  • 从env到mm_struct:环境变量与虚拟内存的底层实现
  • Linux 任务调度在进程管理中的关系和运行机制
  • STM32键盘带蓝牙功能
  • 时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析
  • 首家!数巅AskBI通过中国信通院数据分析智能体专项测试
  • Shell实现服务检查看门程序
  • 实时数据可视化的“心跳”设计:毫秒级延迟下的动态图表抗闪烁优化方案