Interpolations

Page Contents

Overview

插值格式为${expression},其中expression可以是所有类型的表达式(例如${100 + x})。

Note:

可以将 FreeMarker 配置为使用[=expression]语法。 进一步了解替代语法...

插值用于插入expression的值,该值转换为文本(字符串)。插值只能在两个地方使用:text sections(例如<h1>Hello ${name}!</h1>)和在字符串 Literals 表达式中(例如<#include "/footer/${company}.html">)。

表达式的结果必须是字符串,数字或日期/时间/日期时间值,因为(默认情况下)只有通过插值自动将这些类型转换为字符串。其他类型(例如布尔值,序列)的值必须“手动”转换为字符串(请参阅稍后的一些建议),否则错误将停止模板处理。

Warning!

在不需要/不应该/不能使用插值的地方使用插值是一个常见的错误。插值仅在text sections(例如<h1>Hello ${name}!</h1>)和string literals(例如<#include "/footer/${company}.html">)中起作用。典型的* WRONG 用法是<#if ${big}>...</#if>,这会产生语法错误。您应该只写<#if big>...</#if>。另外,<#if "${big}">...</#if> WRONG *,因为它将参数值转换为字符串,并且if指令需要布尔值,所以它将导致运行时错误。

Automatic escaping

如果插值在text section中(而不是在字符串 Literals 表达式中),则其插入的文本将自动转义,如果 FreeMarker 已正确配置在此处查看有关逃逸的更多信息...

插入数值的指南

如果表达式的计算结果为数字,则数值将根据默认数字格式转换为字符串。这可能包括最大的小数位数,分组等。通常,程序员应设置默认的数字格式。模板作者不必处理它(但可以使用number_format设置;请参见设置指令文档)。另外,您可以使用string built-in覆盖单个插值的默认数字格式。

使用的小数点分隔符(以及其他类似的符号,如组分隔符)取决于当前的语言环境(语言,国家/地区),程序员也应设置该语言环境。例如,此模板:

${1.5}

如果当前语言环境为英语,则会打印如下内容:

1.5

但是,如果当前的语言环境是德语,那么它将打印如下内容:

1,5

因为德国人使用逗号作为小数点分隔符。

Warning!

如您所见,插值打印是针对人类受众(至少默认情况下),而不是“计算机受众”。在某些情况下,这是不好的,例如当您将数据库记录 ID 作为 URL 的一部分或 HTML 形式的不可见字段值打印时,或者当您打印 CSS/JavaScript 数字 Literals 时,因为将读取这些打印的值通过计算机程序而不是人类。大多数计算机程序对数字的格式都非常讲究,只了解一种简单的美国数字格式。为此,请使用内置的c(代表“计算机受众”),例如:

<a href="/shop/productdetails?id=${product.id?c}">Details...</a>

插入日期/时间/日期时间值的指南

如果表达式的计算结果为类似日期的值,则将根据默认格式将其转换为文本。通常,程序员应设置默认格式。模板作者不必处理它(但是如果您愿意,可以在setting directive的文档中找到查看 date_format,time_format 和 datetime_format 设置)。另外,您可以使用string built-in覆盖单个插值的默认格式。

Warning!

要以文本形式显示类似日期的值,FreeMarker 必须知道其使用的部分,即仅日期部分(年,月,日)还是时间部分(小时,分钟,秒,毫秒) ), 或两者。不幸的是,由于 Java 平台的技术局限性,对于某些变量,无法自动检测到它。询问程序员数据模型是否包含此类有问题的变量。如果无法确定日期的哪些部分正在使用中,则必须使用日期,时间和日期时间内置插件(如${lastUpdated?datetime})帮助 FreeMarker,否则它将因错误而停止。

插入布尔值的指南

默认情况下,尝试通过插值打印布尔值会导致错误并中止模板处理。例如,这将导致错误:${a == 2}并且不会打印“ true”或类似的内容。这是因为没有通用的表示布尔值的方法(有时您要打印是/否,有时要启用/禁用,开/关等)。

但是,您可以使用?string built-in将布尔值转换为字符串。例如,要打印“已婚”变量的值(假设它是布尔值),可以编写${married?string("yes", "no")}

可以使用boolean_format设置将 FreeMarker 配置为默认的布尔格式,然后使用${married},这样便可以使用。但是,在大多数应用程序中不建议这样做,因为布尔值应该在不同的位置以不同的方式呈现,并且将格式保留为默认设置可能只是一个疏忽,因此会产生错误。

当您要生成 JavaScript 或其他计算机语言部分时,则应使用${someBoolean?c}(“ c”代表计算机 Spectator)打印真/假。 (请记住,?c还用于为计算机 Spectator 打印数字.)

确切的转化规则

对于那些感兴趣的人,从表达式值到字符串(然后仍然可以转义)的确切转换规则如下:

  • 如果该值为数字,则它将按照number_format设置指定的格式转换为字符串。因此,这通常是面向人类受众的格式,而不是针对计算机受众。

  • 否则,如果该值为日期,时间或日期时间,则将其分别转换为使用date_formattime_formatdatetime_format设置指定的格式的字符串。如果无法检测到它是什么样的日期型值(日期 vs 时间 vs 日期时间),则会发生错误。

  • 否则,如果该值是字符串,则不进行任何转换。

  • 否则,如果引擎处于经典兼容模式下:

  • 如果值为布尔值,则将 true 值转换为“ true”,将 false 值转换为空字符串。

    • 如果表达式未定义(null或变量未定义),则将其转换为空字符串。

    • 否则,错误将中止模板处理。

  • 否则,错误将中止模板处理。