替代(方括号)语法

Page Contents

有时,生成的内容使用与默认 FreeMarker 语法冲突的符号(通常,${...} -s FreeMarker 应该照原样打印,不带解释),或者您使用某些与默认 FreeMarker 语法混淆的工具(通常与<>混淆) 。虽然通常有一些技巧可以解决这些情况(例如您可以使用${'$'}{x}照原样打印${x}),但它们通常很不方便。因此,插值语法可以配置为[=x]而不是${x}。此外,与此无关,可以将 FreeMarker 标签语法配置为使用[],就像[#if x]...[/#if]一样。

Note:

虽然“标记语法”和“插值语法”都可以配置为使用方括号,但它们是完全独立的配置设置。因此,整体语法可以像[#if x]${y}[/#if]<#if x>[=y]</#if>

方括号标记语法

Note:

本节是关于* tag *语法的,而不是interpolation syntax。不要混淆两者,它们是独立的。

Note:

自 FreeMarker 2.3.4 起存在此功能。

FreeMarker 支持替代标记语法,其中 FreeMarker 指令和 Comments 中使用[]而不是<>,例如:

要使用方形标记语法而不是默认的语法,程序员应将 FreeMarker 如此配置(请参阅Configuraton.setTagSyntaxtag_syntax设置)。但是,也可以在模板中使用ftl directive来强制执行标签语法(请参阅下文)。

例如,这是使用另一种语法的Getting Started的最后一个示例:

<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]也可以)启动文件,则无论配置设置如何,文件都将使用方括号* tag 语法(但这不会将插值语法更改为[=...])。同样,如果您以<#ftl ...>开头,则文件将使用常规(尖括号)标记语法。如果文件中没有ftl指令,则程序员可以通过配置 FreeMarker 来确定标记 syntax *是什么(程序员请参见 API javadocs 中的Configuration.setTagSyntax(int))。程序员很可能使用出厂默认设置。

方括号内插语法

Note:

本节介绍的是* interpolation *语法,而不是tag syntax。不要混淆两者,它们是独立的。

Note:

自 FreeMarker 2.3.28 起存在此功能

在这种情况下,您可以编写[=expression]而不是${expression}(和不推荐使用的#{expression})。程序员可以通过配置激活此语法(请参见 Java API 中的Configuration.setInterpolationSyntax);与标记语法不同,它不能在模板内部指定。它可以与方括号标记语法和不与_一起使用,因为它们在技术上是无关的,但是当使用方括号插值语法时,使用方括号标记语法可能更美观:

[#--
  Note:
  This example uses both interpolation_syntax=squareBracket and tag_syntax=squareBracket,
  but you can also use interpolation_syntax=squareBracket and tag_syntax=angleBracket.
--]
<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>

使用方括号内插语法时,模板中的${expression}#{expression}将只是静态文本,将按原样打印。如果生成的输出应包含那些输出(尤其是${expression}是经常使用的),例如在生成 JSP 文件时,这将非常有用。

还有第三种标记语法“ dollar”,其中只有插值语法是${expression},而弃用的#{expression}只是静态文本。 (#{expression}仍是插值的那个称为“旧式”插值语法,是向后兼容的默认值.)

上一章 首页 下一章