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}
仍是插值的那个称为“旧式”插值语法,是向后兼容的默认值.)