SpringBoot接入FreeMarker完整指南:依赖、配置与可运行样例
前言
FTL 模板语法在 FreeMarker常用语法与指令详解里整理过了,这篇解决另一半问题:怎么把 FreeMarker 接进 SpringBoot。依赖、配置、渲染、全局变量,配一套能直接跑的样例。
1、引入依赖
|
|
starter 会自动带上 freemarker 核心包和 FreeMarkerAutoConfiguration,不加任何配置就能跑。
2、目录结构
src/main/java
└── com.example.demo
├── DemoApplication.java
└── controller/PageController.java
src/main/resources
├── application.yml
├── static/ # 静态资源(css/js)
└── templates/ # 模板默认目录(classpath:/templates/)
├── index.ftl
├── user/
│ └── detail.ftl
└── common/
├── header.ftl
└── footer.ftl
约定就三条:模板放 classpath:/templates/,后缀 .ftl,Controller 返回视图名不带后缀。
3、配置说明
|
|
几个配置说下我的用法:
| 配置 | 作用 | 建议 |
|---|---|---|
cache |
模板缓存 | 生产开 true,开发关掉 |
template-loader-path |
模板目录 | 保持默认,模板外置部署时加 file:/app/templates/ |
settings.classic_compatible |
null 不报错 | 能兜底,但也会把模板里写错的变量名藏住,看团队情况 |
settings.number_format |
数字格式 | 必配 0.##,不然金额显示成 1,000.5 |
suffix |
视图后缀 | 改成 .html 的话设计稿可以直接当模板用 |
4、Controller 写法
4.1 返回视图名 + Model(最常用)
|
|
4.2 ModelAndView 写法
|
|
4.3 注意
同一个项目里接口和页面共存时,接口用 @RestController 或者方法上加 @ResponseBody,不然返回的字符串会被当成视图名去找模板。
5、模板样例(templates/user/detail.ftl)
<#-- 公共头尾引入 -->
<#include "../common/header.ftl">
<h1>${title}</h1>
<table border="1">
<tr><th>姓名</th><th>年龄</th><th>VIP</th></tr>
<#list users as u>
<tr>
<td>${u.name!""}</td>
<td>${u.age!0}</td>
<td>
<#if u.vip?? && u.vip>
<span style="color:red">是</span>
<#else>
否
</#if>
</td>
</tr>
</#list>
</table>
当前时间:${.now?string("yyyy-MM-dd HH:mm:ss")}
<#include "../common/footer.ftl">
启动访问 http://localhost:8080/page/users 就能看到结果。
6、全局共享变量
站点名、备案号、版本号这种全站变量,不要在每个 Controller 里重复塞,注册一次全部模板可用:
|
|
<footer>${site.siteName} ${site.version}</footer>
7、踩过的坑
- 数字变千分位:
1000显示成1,000。全局配settings.number_format: 0.##,或者单处${num?c} - null 直接 500:
${user.name}遇到 user 是 null 就抛异常。要么classic_compatible: true兜底,要么规范写${user.name!""}、判空<#if user??> - 改模板不生效:
cache: true缓存了,开发期改 false - jar 包内模板找不到:
template-loader-path配成了文件路径,打 jar 后要用classpath:前缀 - 和 Thymeleaf 共存打架:两个 starter 同时引入,视图解析器抢视图名,按前缀区分或者只留一个
- 静态资源 404:模板里引用 css/js 用
/css/xxx从根开始写
8、和 Thymeleaf 怎么选
| 维度 | FreeMarker | Thymeleaf |
|---|---|---|
| 模板形态 | 纯文本模板,HTML 只是用途之一 | 原生 HTML,设计稿直接浏览器能预览 |
| 性能 | 文本替换,快 | 稍重一点,缓存后差距很小 |
| 语法 | <#if> 指令风格 |
th:* 属性风格 |
| 邮件/代码生成等非 HTML | 强项 | 不合适 |
| Spring 官方态度 | 一等支持 | 一等支持,文档示例更多 |
我的结论:页面渲染选 Thymeleaf 顺手(原型即模板);生成邮件、代码片段、配置文件这类非 HTML 的文本,FreeMarker 更合适。两个一起用也不冲突,各干各的。Thymeleaf 的接入写在 SpringBoot接入Thymeleaf完整指南里。
相关阅读
- 原文作者:Anttu
- 原文链接:https://anTtutu.github.io/post/2024-11-21-springboot-freemarker-integration/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。