FreeMarker 模板引擎在线手册归纳 之 FTL语法

2020-03-22   87 次阅读


模板教程
模板结构教程
归纳总结

FTL语言语法

①if

可以使用if指令来根据条件判断是否要执行某一段代码

 <h1>
    Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
  </h1>

上述代码中只有当用户是"Big Joe"时, our beloved leader字段才会显示

除了=还可以使用!=

<#if animals.python.price != 0>
  Pythons are not free today!
</#if>

animals.python.price为非零值时,Pythons are not free today!会显示

②else

使用false可以指定当条件为false时程序要执行的内容

<#if animals.python.price < animals.elephant.price>
  Pythons are cheaper than elephants today.
<#else>
  Pythons are not cheaper than elephants today.
</#if>

同样该标签也可以使用在list标签(下面会讲)中

<#list misc.fruits>
  <p>Fruits:
  <ul>
    <#items as fruit>
      <li>${fruit}<#sep> and</#sep>
    </#items>
  </ul>
<#else>
  <p>We have no fruits.
</#list>

③list

显示列表内容
example:

<p>We have these animals:
<table border=1>
  <#list animals as animal>
    <tr><td>${animal.name}<td>${animal.price} Euros
  </#list>
</table>

输出的内容如下

<p>We have these animals:
<table border=1>
    <tr><td>mouse<td>50 Euros
    <tr><td>elephant<td>5000 Euros
    <tr><td>python<td>4999 Euros
</table>

ul标签用法

<ul>
<#list misc.fruits as fruit>
  <li>${fruit}
</#list>
</ul>

不过这种写法有个问题就是当水果数量为0时,依旧会输出多余的ul标签,为了避免这种情况,使用以下标签

④item

<#list misc.fruits>
  <ul>
    <#items as fruit>
      <li>${fruit}
    </#items>
  </ul>
</#list>

大致原理就是,misc.fruits中的水果数量不为0时,list中的内容才会被执行,当水果数量为0时,整个list都将会被略过

⑤sep

分隔符,只有当前项往下还有其他的项的时候,才会被执行,因此最后一个水果不会被执行

⑥include

使用include指令可以在模板中插入其他文件的内容
比如定义一个copyright_footer.htmlHTML界面,随后通过下列方式插入

<html>
<head>
  <title>Test page</title>
</head>
<body>
  <h1>Test page</h1>
  <p>Blah blah...
  <#include "/copyright_footer.html">
</body>
</html>

内建函数

name解释
user?html给出user的HTML转义版本,比如&会用&amp;代替
user?upper_case给出user的大写版本
animal.name?cap_first给出user的首字母大写版本
user给出user值中字符的数量(比如"MyBoss"就是6)
animals?size给出animals序列中项目的个数
<#list animals as animal> 和对应的 </#list>-
animal?index给出了animals中基于0开始的animal索引值
animal?counter与index类似,不过counter是基于1开始的
animal?item_parity基于当前计数的奇偶性,给出字符串 "odd" 或 "even"

注意

  • FreeMarker并不解析FTL标签以外的文本、插值与注释
  • FreeMarker决不能容忍引用不存在的变量,除非明确地告诉它当变量不存在时如何处理
  • FTL区分大小写
  • 插值只能在文本中使用
  • FTL标签不可以在其他FTL标签与插值中使用
  • 如果使用一个不存在的指令,FreeMarker会拒绝执行模板,同时输出错误信息
  • FreeMarker会忽略FTL标签中多余的空白标记

关于表达式与类型的几个tip与注意事项

1.【tip】字符串切分(子串)

<#assign s = "ABCDEF">
${s[2..3]}
${s[2..<4]}
${s[2..*3]}
${s[2..*100]}
${s[2..]}

产生的输出为

CD
CD
CDE
CDEF
CDEF

2.【tip】序列切分

使用seq[range]

<#assert seq = ["A", "B", "C", "D", "E"]>
<#list seq[1..3] as i>${i}</#list>

产生如下输出
BCD

3.【warning】${1.5}

如果当前本地设置为英语时输出的为1.5
而当地区设置为德国时,输出为1,5

因为德国人使用逗号作为小数点

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议