简介
Apache FreeMarker™ 是一个模板引擎:一个基于模板和变更数据生成文本输出(HTML 网页、电子邮件、配置文件、源代码等)的 Java 库。
FreeMarker 没有其他任何依赖,仅仅依赖 Java 自身。
最新版本:FreeMarker 2.3.32(2023-01-12)
maven 依赖
普通 Java 工程按如下方式引入:
|
|
如果是 Spring Boot 工程可以引入 spring-boot-starter-freemarker
:
|
|
代码示例
普通工程
以下代码来源于 FreeMarker 官方教程:
|
|
Product 类如下:
|
|
FreeMarker 模板 test.ftlh
如下:
|
|
Spring Boot 工程
Spring Boot 默认使用 .ftlh
作为后缀,如果需要修改为 .ftl
,请按如下修改配置:
|
|
注意:上述配置中一定不要忘记点号 (.
)。
在 Spring Boot 中实现上述功能(需引入 spring-boot-starter-freemarker
依赖):
|
|
Product 类(使用 Lombok):
|
|
模板文件放在 /resources/templates
目录下。
spring.freemarker
为前缀。如果你希望使用 MVC 的方式直接加载这个页面,可以参考如下:
|
|
运行项目,打开 http://localhost:8080 即可渲染效果。
模板语法
模板结构
FTL 模板由以下部分混合而成:
- 文本(Text): 文本内容会原样输出。
- 插值(Interpolation):这部分的输出会被计算结果替代。插值使用
${...}
。(注:#{...}
已被弃用。See more here) - FTL 标签(FTL tags):与 HTML 标签相似,用于 FreeMarker 指令。
- 注释(Comments):使用
<#--
和-->
来分隔。注释会被 FreeMarker 直接忽略,不会在输出内容中显示。
插值
标准格式为:${expression}
。其中 expression
可以是所有类型的表达式。如:${100 + x}
[=expression]
形式。参考 See more about alternative syntaxes…表达式
- 直接指定值
- 检索变量
- 顶层变量:
user
- 从 Hashes 中检索数据:
user.name
,user["name"]
- 从 Sequences 中检索数据:
products[5]
- 特殊变量:
.main
- 顶层变量:
- 字符串操作
- Sequence 操作
- 连接:
users + ["guest"]
- Sequence 切片: Inclusive end:
products[20..29]
, Exclusive end:products[20..<30]
, Length-based (lenient):products[20..*10]
, Remove starting:products[20..]
- 连接:
- Hash 操作
- 连接:
passwords + { "joe": "secret42" }
- 连接:
- 算数运算:
(x * 1.5 + 10) / 2 - y % 100
- 比较运算:
x == y
,x != y
,x < y
,x > y
,x >= y
,x <= y
,x lt y
,x lte y
,x gt y
,x gte y
, …etc. - 逻辑操作:
!registered && (firstVisit || fromEurope)
- 内建函数:
name?upper_case
,path?ensure_starts_with('/')
- 方法调用:
repeat("What", 3)
- 处理不存在的值:
- 赋值操作:
=
,+=
,-=
,*=
,/=
,%=
,++
,--
- Local lambdas:
x -> x + 1
,(x, y) -> x + y
内置函数参考
指令
标准格式是使用两种 FTL 标签:
- 开始标签:
<#directivename parameters>
- 结束标签:
</#directivename>
例如:<#if something>...</#if>
FTL 标签与 HTML 标签一样,必须正确嵌套。所以下面的代码是错误的,因为 if 指令既在 list 指令的嵌套内容的内部又在外部:
|
|
FreeMarker 可以使用 [
和 ]
替代 <
和 >
。例如:[#if user == "Big Joe"]...[/#if]
。
指令参考:
- Alphabetical index
- assign
- attempt, recover
- autoesc
- compress
- escape, noescape (deprecated)
- flush
- ftl
- function, return
- global
- if, else, elseif
- import
- include
- list, else, items, sep, break, continue
- local
- macro, nested, return
- noautoesc
- noparse
- nt
- outputformat
- setting
- stop
- switch, case, default, break
- t, lt, rt
- User-defined directive (<@…>)
- visit, recurse, fallback
参考
附录
FreeMarker 支持的转义字符
Escape sequence | Meaning |
---|---|
\" | 引号 (u0022) |
\' | 单引号 (u0027) |
\{ | 起始花括号:{ |
\= | 等号:= (Supported since FreeMarker 2.3.28.) |
\\ | 反斜杠 (u005C) |
\n | 换行符 (u000A) |
\r | 回车 (u000D) |
\t | 水平制表符(又称为tab) (u0009) |
\b | 退格 (u0008) |
\f | 换页 (u000C) |
\l | 小于号:< |
\g | 大于号:> |
\a | & 符:& |
\xCode | 字符的十六进制Unicode 码 (UCS code) |
在 \x
之后的 Code 是 1-4 位的十六进制码。下面这个示例中都是在字符串中放置版权符号: "\xA9 1999-2001"
, "\x0A9 1999-2001"
, "\x00A9 1999-2001"
。 如果紧跟十六进制码后一位的字符也能解释成十六进制码时, 就必须把 4 位补全,否则 FreeMarker 就会误解你的意图。
FTL 中的保留名称
下面的这些名称不能在非方括号语法中被用作顶层变量 (比如 .vars["in"]
),因为这是 FTL 中的关键字:
true
:布尔值"true"false
:布尔值"false"gt
:比较运算符"大于"gte
:比较运算符"大于或等于"lt
:比较运算符"小于"lte
:比较运算符"小于或等于"as
:由少数指令使用in
:由少数指令使用using
:由少数指令使用
感谢您的耐心阅读!来选个表情,或者留个评论吧!