On this page
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_format
,time_format
或datetime_format
设置指定的格式的字符串。如果无法检测到它是什么样的日期型值(日期 vs 时间 vs 日期时间),则会发生错误。否则,如果该值是字符串,则不进行任何转换。
否则,如果引擎处于经典兼容模式下:
如果值为布尔值,则将 true 值转换为“ true”,将 false 值转换为空字符串。
如果表达式未定义(
null
或变量未定义),则将其转换为空字符串。否则,错误将中止模板处理。
否则,错误将中止模板处理。