老式 FTL 语法

在FTL标签中使用 # 形式的FTL语法已经是不要求 (在 2.1 版本之前是不允许的)的了。比如,你可以这样写代码:

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>We have there animals:
  <ul>
  <list animals as animal>
    <li>${animal.name} for ${animal.price} Euros
  </list>
  </ul>
  <include "common_footer.html">
</body>
</html>

而没有 # 样式语法的代码对于HTML作者来说更加自然, 它有很多的缺点,所以最终我们决定废弃它。使用新式语法(又称为"严格的语法"), # 是严格要求的。也就是说,像 <include "common_footer.html"> 这样的东西将会原样出现在输出中,因为它们不被认为是FTL标签。 注意用户自定义指令使用 @ 代替 #

然而,为了给用户时间来准备这种改变,在 FreeMarker 2.1 和 2.2 版本中, # 的用法是可选的,除非程序员调用 ConfigurationsetStrictSyntaxMode(true) 在 FreeMarker 配置中开启严格语法模式。 事实上,我们把这个强烈建议给程序员。从后续释出版本开始,这个设置将会初始设置为 true。而且,如果你在模板文件中想使用严格语法或老式语法,你可以用 ftl 指令来指定。

"严格语法"比遗留的FTL语法的好处是:

  • 对于FTL来说,所有 <#...></#...> 都是保留的:

    • 我们可以引入新的指令而不破坏向后兼容。

    • 我们可以检测你是否创留了一个打字错误,也就是 <#inculde ...> 被视为解析时的错误, 而不是被静默地视为简单文本。

    • 对于第三方工具来处理模板(比如高亮语法显示)来说是简单的, 特别是因为它们不需要知道新释出版本中被引入的新指令。

    • 模板更易于阅读,因为很容易辨认嵌入在HTML或其他标记中的 <#...> 标签。

  • <#</# 是合法的XML (除了在CDATA段中),而且其他大多数SGML应用中也是合法的, 所以它们不能妨碍用在静态文本部分(比如你在生成的XML中有 include 元素)的标签。