-
application.yml文件配置
spring:
freemarker:
# 后缀名
suffix: .ftl
# 设置文档类型
content-type: text/html
# 设置页面编码格式
charset: UTF-8
# 设置页面缓存
cache: false
#req访问request
request-context-attribute: req
# 设置ftl文件路径
template-loader-path: classpath:/templates
-
插值
${...}: FreeMarker在输出时将其替换为大括号内表达式的实际值。它们被称为 插值
-
指令
FTL标签(用于FreeMarker模板语言标签):
FTL标签有点类似于HTML标签,但它们是FreeMarker的指令,不会打印到输出。这些标签的名称以 #开头
-
ftl文件中的注释
<#-- freemarker的注释 -->
-
静态文本
任何不是 FTL标签 或 插值 或 注释 的东西都被认为是静态文本
FreeMarker不会解释; 它只是按原样打印到输出
-
if指令
<!-- 与 HTML标签结合使用 -->
<a href="...">${latestProduct.name}</a>
<a href="${latestProduct.url}">...</a>
<!-- 错误用法: -->
<#if ${user} == "Big Joe">...</#if>
<!-- 通常,指令或插值中的 未加引号的 单词 被视为对变量的引用-->
<#if user == "Big Joe">...</#if>
<!-- boolean型变量 -->
<#if protected>
true
</#if>
-
if...else指令
<#if python.price < elephant.price >
1
<#elseif elephant.price < python.price >
2
<#else>
3
</#if>
-
list指令
<table border=1>
<#list animals as animal>
<td>${animal.name}<td>
${animal.price}
</#list>
</table>
但是如果 lists碰巧有0个元素,它仍然会打印一个"<ul></ul>",而不是什么都不打印。
为避免这种情况,可以使用以下形式 list
<!-- 先判断 lists是否为空 -->
<#list fruits>
<ul>
<#items as fruit>
${fruit}
<#sep>and</#sep>
</#items>
</ul>
<#else>
fruits为空时执行这里的代码
</#list>
由于FreeMarker不解释(FTL标签、插值、FTL注释)之外的文本(即FreeMarker不识别HTML代码)
故可以在HTML标签中的使用FTL标签
<div
<#if protected>
class="protected"
</#if >
>
- 内置函数
...
- 处理未定义的变量
无论何时,都可以通过使用 ${user!默认值} 的方式来为未定义的变量指定默认值
<h1> Welcome ${user!"visitor"} </h1>
通过 user?? 来查询变量是否存在
<#if user??>
<h1>Welcome ${user}</h1>
</#if>
如果您想测试Java方法是否已返回 null:
<#if foo.bar()??>
注意:
${animals.python.price
!0}
只有在animals.python变量 肯定存在时,才能这么写
如果
animals
或python变量不存在
,模板处理将以“未定义变量”错误停止。为了防止这种情况,你必须写成
${(animals.python.price)
!0}
同样的逻辑, 应该写成
(animals.python.price)??
而不是animals.python.price?? (animals和python可能未定义)
- 一个FTL标签不能写在里面另一个FTL标签:
例如,这是错误的:
<#if <#include 'foo'>='bar'>...</#if>
- 注释可以放在FTL标签和插补中:
例如:
<#list <#-- some comment... --> animals as <#-- again... --> animal>
- 字符串拼接:
警告: 用户经常犯的错误是在不需要/不应该/不能使用的地方使用插值。
插值仅在 文本部分 和 指令的属性值为字符串时 起作用。例如:
<h1>${style}</h1> <#assign s1 ="Hello ${style1}"> ${s1} <#assign s2 ="Hello " + style1> ${s2}
- 字符串截取:
获取指定位的字符:
user[0] (结果将是一个长度为1的字符串; FTL没有单独的字符类型)
<#assign s = "ABCDEF">
${s[2..3]}
${s[2..<4]}
${s[2..*3]}
${s[2..*100]}
${s[2..]}
CD 第2位到第3位
CD 第2位到小于4
CDE 第2位往后数3位
CDEF 第2位往后数100位
CDEF 第2位开头的所有
- list 截取:
<#assign seq = ["A", "B", "C"]>
<#-- Not an error -->
<#list seq[2..*2] as i>
${i}
</#list>
<#-- Not an error -->
<#list seq[3..*2] as i>
${i}
</#list>
<#-- Not an error -->
<#list seq[3..] as i>
${i}
</#list>
List集合:list = [1,2,3] ; list=[1..100] 表示 1 到 100 的集合,反之亦然。
Map集合:map = {"key" : "value" , "key2" : "value2"},key 必须是字符串哦!
- 可以使用与字符串相同的方式连接序列(+):
<#list [“Joe”,“Fred”] + [“Julia”,“Kate”] as user>
${user}
</#list>
<#list users + admins as person>
但结果序列的读取总是比原始的两个序列慢一点。
因此,在数十或数百次重复连接之后,结果对于读者来说可能是不切实际的慢。
- 可以使用与字符串相同的方式连接哈希值 (+):
如果两个哈希值都包含相同的键,则+号
右侧的哈希值优先
<#assign ages = {"Joe":23,"Fred":25} + {"Joe":30,"Julia":18}>
- FreeMarker永远不会自动将字符串转换为数字:
但它可以自动将数字转换为字符串
- 只想要计算结果的整数部分:
这可以通过 int
内置函数实现 : $ { - 1.999?int}
- 比较运算符:
FreeMarker将>号
字符解释 为FTL标记的结束字符,像 <#if x gt y>
lt
替代<
,lte
替代<=
,gt
替代>,
gte
替代>=
将表达式放入括号中的是另一个技巧 <#if (x > y)>
,尽管它被认为不那么优雅。
- 内置函数
防止函数和变量进行名称冲突,使用问号(?
)将函数与对象分开,而不是点(.
)
为简洁起见,如果方法没有参数,你必须省略()。
比如,得到 path
你必须写 的长度 path?length
,而不是 path?length()
- 打印布尔值
与数字不同,布尔值没有普遍接受的格式,甚至在同一页面中也没有通用格式。
就像你在HTML页面上展示产品是否可以清洗一样,你几乎不想为访客展示“可洗:真实”,而是“可洗:是”。
因此,我们强制模板作者(通过${washable}
会报错)找出他的人类知识如何在给定位置显示布尔值。
${washable?string("yes", "no")}
${caching?string("Enabled", "Disabled")}
,
${heating?string("on", "off")}
- 时间格式化 :
${date?string("yyyy-MM-dd")}
- Map集合:
直接通过Key获取 Value值
${mapData["name"]}
如果你只需要列出的该键值对 Map
,你可以写类似
<#list myMap as k, v>
${k}: ${v}
</#list>
- 定义自己的指令:
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
macro
指令本身不会打印任何内容; 它只是创建宏变量
只有当您将变量用作指令时,才会执行<#macro greet>
和 之间的事物 </#macro>
(称为宏定义体)
<@greet></@greet>
或
<@greet/>
您可以通过编写@而不是 #
在FTL标记中使用用户定义的指令
- 定义自己的指令(带参数):
<#macro greet person >
<font size =“+ 2”> Hello $ {person}</ font>
</#macro>
<@greet person ="Fred" />
在表达式中使用指令的输出(作为另一个指令的参数)?
使用assign指令将指令的输出捕获到变量中 。例如:
<#assign capturedOutput> <@ outputSomething /> </ #assign>
<@otherDirective someParam = capturedOutput />
Ctrl + F9 : 重新编译