<ul>
<#list animals as being>
<li>${being.name} for ${being.price} Euros
<#if user == "Big Joe">
(except for you)
</#list> <#-- WRONG! The "if" has to be closed first. -->
</#if>
</ul>
==============
自定义指令可以使用 macro 指令来定义,这是模板设计者所关心的内容。
宏是有一个变量名的模板片段。你可以在模板中使用宏作为自定义指令,这样就能进行
重复性的工作。例如,创建一个宏变量来打印大号的”Hello Joe!”。
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
macro 指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为
greet 的变量。在<#macro greet>和</#macro>之间的内容(称为宏定义体)当
使用它作为指令时将会被执行。你可以在 FTL 标记中通过@代替#来使用自定义指令。使用
变量名作为指令名。而且,自定义指令的结束标记也是需要的。那么,就可以这样来使用
greet 宏了:
<@greet></@greet>
宏能做的事情还有很多,因为在<#macro ...>和</#macro>之间的东西是模板
片段,也就是说它可以包含插值(${...})和 FTL 标签(如<#if ...>...</#if>) 。
注意:
程序员通常将使用<@...>,这称为宏调用。
我们来改进 greet 宏使之可以使用任意的名字,而不仅仅是”Joe”。为了实现这个目
的,就要使用到参数。在macro 指令中,宏名称的后面位置是用来定义变量的。这里我们
仅在 greet 宏中定义一个变量,person:
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
那么就可以这样来使用这个宏:
<@greet person="Fred"/> and <@greet person="Batman"/>
=======================
下面的这些名称不能在非方括号语法中被用作顶层变量(比如 vars["in"]),因为
这是 FTL 中的关键字。
true:布尔值“true”
false:布尔值“false”
gt:比较运算符“大于”
gte:比较运算符“大于或等于”
lt:比较运算符“小于”
lte:比较运算符“小于或等于”
as:由少数指令使用
in:由少数指令使用
using:由少数指令使用
========================
以在变量名后面通过放置??来询问 FreeMarker 一个变量是否存在。将它和 if
指令合并,那么如果 user 变量不存在的话将会忽略整个问候代码段:
<#if user??><h1>Welcome ${user}!</h1></#if>
========================
通常来说,FreeMarker 不会自动将字符串转换为数字,反之会自动进行。
有时我们只想获取计算结果的整数部分,这可以使用内建函数 int 来解决。(关于内
建函数后续章节会来解释)
${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}
仍然假设 x 的值是 5,那么将会输出:
2
1
1
-1
-1
===============================
内建函数
正如其名,内建函数提供始终可用的内置功能。内建函数以?形式提供变量的不同形式
或者其他信息。使用内建函数的语法和访问哈希表子变量的语法很像,除了使用?号来代替
点,其他的都一样。例如得到字符串的大写形式:user?upper_case。
在参考文档中可以查到所有内建函数的资料。现在,我们只需了解一些重要的内建函数
就行了。
字符串使用的内建函数:
html: 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如<代
替<) 。
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格
序列使用的内建函数:
size:序列中元素的个数
数字使用的内建函数:
int:数字的整数部分(比如-1.9?int 就是-1)
示例