On this page
替代(方括号)语法
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 中使用[和]而不是<和>,例如:
调用 sched 义指令:
[#list animals as animal]...[/#list]调用用户定义的指令:
[@myMacro /]Comment:
[#-- the comment --]
要使用方形标记语法而不是默认的语法,程序员应将 FreeMarker 如此配置(请参阅Configuraton.setTagSyntax或tag_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}仍是插值的那个称为“旧式”插值语法,是向后兼容的默认值.)