Directives
您可以使用 FTL 标签调用**指令。在示例中,您调用了list
指令。从语法上讲,您已经使用两个标签完成了此操作:<#list animals as animal>
和</#list>
。
有两种 FTL 标签:
-
起始标签:
<#directivename parameters>
-
结束标签:
</#directivename>
除了标记名称以#
开头之外,这与 HTML 或 XML 语法相似。如果指令没有嵌套的内容(开始标签和结束标签之间的内容),则必须使用没有结束标签的开始标签。例如,您编写了<#if something>...</#if>
,但是只有<#include something>
,因为 FreeMarker 知道include
指令不能包含嵌套内容。
parameters
的格式取决于directivename
。
实际上,有两种类型的指令:predefined directives和user-defined directives。对于用户定义的指令,请使用@
而不是#
,例如<@mydirective parameters>...</@mydirective>
。进一步的区别是,如果指令没有嵌套内容,则必须使用<@mydirective parameters />
之类的标记,类似于 XML 中的标记(例如<img ... />
)。但是用户定义的指令是一个高级主题,将在later中进行讨论。
FTL 标签(如 HTML 标签)必须正确嵌套。因此以下代码是错误的,因为if
指令位于list
指令嵌套内容的内部和外部:
<ul>
<#list animals as animal>
<li>${animal.name} for ${animal.price} Euros
<#if user == "Big Joe">
(except for you)
</#list> <#-- WRONG! The "if" has to be closed first. -->
</#if>
</ul>
请注意,FreeMarker 并不关心 HTML 标签的嵌套,而只关心 FTL 标签的嵌套。它只是将 HTML 视为纯文本,不会以任何方式对其进行解释。
如果您尝试使用不存在的指令(例如,您 Importing 了错误的指令名称),FreeMarker 将拒绝使用该模板并产生一条错误消息。
FreeMarker 会忽略 FTL 标签内多余的white-space。所以你可以这样写:
<#list[BR]
animalsas[BR]
animal[BR]
>[BR]
${animal.name}for${animal.price}Euros[BR]
</#list>
但是,您不能在<
或</
与指令名称之间插入空格。
可以在模板语言参考/指令参考中找到所有指令的完整列表和说明(但我建议您先阅读有关表达式的章节)。
Note:
可以将 FreeMarker 配置为使用[
和]
而不是 FTL 标签和 FTLComments 中的<
和>
,例如[#if user == "Big Joe"]...[/#if]
。有关更多信息,请阅读:杂项/替代(方括号)语法。
Note:
可以对 FreeMarker 进行配置,以便它可以理解不带#
(如<if user == "Big Joe">...</if>
)的 sched 义指令。但是,我们不建议使用此模式。有关更多信息,请阅读:模板语言参考/不建议使用的 FTL 构造/旧的 FTL 语法