Overall structure

模板实际上是您使用称为 FTL (对于 FreeMarker 模板语言)的语言编写的程序。这是一种非常简单的编程语言,专门用于编写模板而已。

模板(= FTL 程序)是以下部分的组合:

  • 文本 :将按原样打印到输出的文本。

  • 插值 :这些部分将在输出中替换为计算值。插值由${}(或#{})定界,但不再使用在这里看到更多

  • FTL 标签 :FTL 标签有点类似于 HTML 标签,但是它们是 FreeMarker 的说明,不会被打印到输出中。

  • Comments :Comments 与 HTMLComments 相似,但由<#---->分隔。 FreeMarker 将忽略 Comments,并且 Comments 不会写入输出中。

让我们看一个具体的模板。我已经用颜色标记了模板的组件:文本,内插,FTL 标签,Comments。我打算使用* [BR] * -s 可视化line breaks

<html>[BR]
<head>[BR]
<title>Welcome!</title>[BR]
</head>[BR]
<body>[BR]
<#--Greettheuserwithhis/hername-->[BR]
<h1>Welcome${user}!</h1>[BR]
<p>Wehavetheseanimals:[BR]
<ul>[BR]
<#listanimalsasanimal>[BR]
<li>${animal.name}for${animal.price} Euros[BR]
</#list>[BR]
</ul>[BR]
</body>[BR]
</html>

FTL 区分大写和小写字母。因此list是很好的指令名称,而List不是。同样,${name}${Name}${NAME}不同

重要的是要认识到插值只能用于文本(和字符串 Literals 表达式;请参见later)。

一个 FTL 标签不能在另一个 FTL 标签内,也不能在插值内。例如,这是* WRONG *:<#if <#include 'foo'>='bar'>...</#if>

Comments 可以放在 FTL 标签和插值中。例如:

<h1>Welcome${user <#-- The name of user -->}!</h1>[BR]
<p>Wehavetheseanimals:[BR]
<ul>[BR]
<#list<#-- some comment... --> animals as<#-- again... --> animal>[BR]
...

Note:

对于尝试过上述示例的人员:您可能会注意到,即使我们说文本是按原样打印的,模板输出中也缺少一些空格,制表符和换行符。现在就不用理会。这是因为启用了称为“空白剥离”的功能,并且该功能会自动删除一些多余的空格,制表符和换行符。 later对此进行说明。