替换(方括号)语法

Note:

这个特性从 FreeMarker 2.3.4 版本后才存在。

FreeMarker支持一个替换的语法。就是在FreeMarker的指令和注释中用 [] 来代替 <>,例如下面这个例子:

  • 调用预定义指令:[#list animals as animal]...[/#list]
  • 调用自定义指令:[@myMacro /]
  • 注释:[#-- the comment --]

为了使用这种语法从而代替默认语法,从模板开始,使用 ftl 指令 都要使用这用语法。 如果你不知道什么是 ftl 指令,那么就用 [#ftl] 来开始模板,要记住这个要放在文件的最前面(除了white-space可以在它前面)。 例如,下面的示例是 入门 章节的最后一个例子使用这种替换语法的样子(假设这是一个完整的模板,而不是一个片段):

[#ftl]
<p>We have these animals:
<table border=1>
  <tr><th>Name<th>Price
  [#list animals as animal]
  <tr>
    <td>
      [#if animal.size == "large"]<b>[/#if]
      ${animal.name}
      [#if animal.size == "large"]</b>[/#if]
    <td>${animal.price} Euros
  [/#list]
</table>

这种替换语法(方括号)和默认语法(尖括号)在一个模板中是相互排斥的。 那就是说,整个模板要么全部使用替换语法,要么全部使用默认语法。 如果模板使用了替换语法,那么如 <#if ...> 这样的部分就会被算作是静态文本,而不是FTL标签了。类似地,如果模板使用默认语法, 那么如 [#if ...] 这样的也会被算作是静态文本, 而不是FTL标签。

如果你以[#ftl ...] (... 代表可选的参数列表, 当然仅用 [#ftl] 也行)来开始文件,那文件就会使用替换(方括号)语法。 如果使用 <#ftl ...> 来开始, 那么文件就会使用正常(尖括号)语法。如果文件中没有 ftl 指令, 那么程序员可以通过配置FreeMarker (程序员可以参看 javadoc API 文档中的 Configuration.setTagSyntax(int)) 来决定使用哪种语法。 但是大多数情况,程序员可能使用默认配置。FreeMarker 2.3.x 版本默认配置使用常规语法。 而2.4版本中的默认配置将会自动检测,也就是说第一个FreeMarker标签决定了语法形式 (它可以是任意的,而不仅仅是ftl)。