2.3.28
Page Contents
发布日期:2018-04-04
FTL 方面的更改
-
添加了新的special variable,
get_optional_template
(FREEMARKER-84)。当您需要包括或导入可能丢失的模板,并且需要以某种特殊方式处理这种情况时,可以使用它。 在这里查看详细信息... -
添加了新的special variable,
caller_template_name
(FREEMARKER-83),它们返回从中调用当前宏或函数的模板的名称(路径)。如果您要解析相对于调用者模板的路径,则它最有用。 -
添加了新的内置
templateName?absolute_template_name
或templateName?absolute_template_name(baseName)
,可用于将相对模板名称转换为绝对模板名称。 在这里查看更多... -
添加了新的内置函数:
sequence?min
和sequence?max
(FREEMARKER-86),它们从数字或日期/时间/日期时间列表中返回最小和最大的项。 在这里查看更多... -
现在可以将模板语言配置为使用
[=expression]
而不是${expression}
和#{expression}
,如果生成的文本中有很多${...}
或#{...}
,这将非常有用,因此它们应该是静态文本。请参阅有关方括号内插语法的更多信息,请点击此处。模板语言也可以配置为仅使用${expression}
,并将#{expression}
视为静态文本。 (请参阅interpolation_syntax
配置设置或Configuration.setInterpolationSyntax(int)
方法.) -
在字符串 Literals 中,
\=
现在是有效的转义序列,导致=
。当您使用新的[=exp]
插值语法时,这很有用,可以使用"Literal [\=x]"
这样的字符串 Literals 对其进行转义。 -
错误已修复(FREEMARKER-83);仅当incomplatible_improvements设置为 2.3.28(或更高版本)时,此修复才有效。调用宏或函数(在模板中定义的东西,而不是直接在 Java 中定义的东西)并且参数列表包含
.current_template_name
时,它将正确地求值到包含调用的模板,而不是包含宏或函数定义的模板。 (当然,仍将在调用的宏或函数的上下文中评估参数默认值表达式.) -
修正了错误:当以
""
作为参数调用string?split(separator)
时,该字符串将立即拆分为字符。之前它抛出了IllegalArgumentException
(除非指定了r
标志)。
Java 方面的更改
-
添加了新的
ParserConfiguration
(例如Configuration
和TemplateConfiguration
)设置interpolation_syntax
。它具有 3 个可能的值: -
legacy
(默认设置):插值看起来像${...}
或#{...}
。请注意,#{...}
已被弃用很长时间了。-
dollar
:插值看起来像${...}
。使用这种语法,#{...}
将只是静态文本。 -
square_bracket
:插值看起来像[=...]
。使用这种语法,${...}
和#{...}
只是静态文本。因此,如果您以已经使用那些格式(通常为${...}
)的格式生成输出,例如生成 JSP 页面或生成使用默认语法的 FreeMarker 模板,则将很有用。
-
-
当使用
String
-String
键值对(例如Configuration.setSetting(String, String)
或.properties
文件)指定output_format
配置设置时,现在可以通过短名称(例如output_format=HTML
)而不是通过类名指定标准输出格式。 (自定义格式仍然必须通过类名来引用,因为 FreeMarker 无法知道其名称,因为它不知道自定义类.) -
添加了具有
Object customLookupCondition
参数的新的Configuration.removeTemplateFromCache
重载。这对于从非null
自定义查找条件获得的缓存中手动撤离模板很有用。 -
向
BeansWrapper.MethodAppearanceDecision
:replaceExistingProperty
添加了新属性。当通过MethodAppearanceDecision.exposeAsProperty
将类似size()
的方法作为 JavaBean 属性公开时,这很有用,但是还有一个具有相同名称的“真实” JavaBean 属性(例如getSize()
)。默认情况下,不替换不动产,但现在可以用replaceExistingProperty
代替。 -
DirectiveCallPlace
现在具有Template getTemplate()
方法,因此您可以查询TemplateDirectiveModel
是从哪个模板调用的。 (对于宏/功能,此功能与.caller_template_name
相似.) -
添加了
Environment.rootBasedToAbsoluteTemplateName(String)
,它将通常用于 FreeMarker Java API 的基于根的名称(例如Configuration.getTemplate(name)
)转换为绝对路径,可以安全地传递给<#include path>
,这样就不会被误解为相对于模板目录。 -
修复了调用 JSP 标签时的异常处理:
-
已修复的错误(FREEMARKER-88):如果 JSP
SimpleTag
(通常是InvalidReferenceException
)的主体(嵌套内容)中出现了不是TemplateModelExceptoin
的TemplateException
,则导致异常处理代码中出现了ClassCastException
,因此引发了模板处理而不是原始的 exception。-
修正了错误:对于基于 JSP 标记的自定义标记,如果正文(嵌套内容)中发生了异常,则可能发生了
IndexOutOfBoundsException
,从而替换了原始异常。 -
现在,当 JSP 标记中出现
TemplateException
时,就可以避免将非TemplateModelException
TemplateException
-s(通常是InvalidReferenceException
-s)包装为TemplateModelException
-s。
-
-
现在,默认的算术引擎(
ArithmeticEngine.BIGDECIMAL_ENGINE
)可以将无限(正数和负数)与任何其他标准数值类型进行比较。以前,由于BigDecimal
不能表示无穷大,所以它仅在某些特殊情况下有效。此外,还进行了一些性能优化,以稍微降低对BigDecimal
的影响和转化次数。 -
避免了在多个线程上执行模板时由
java.beans.PropertyDescriptor.getReadMethod()
同步(FREEMARKER-80)引起的性能瓶颈。 -
添加了
TemplateModelUtils.getKeyValuePairIterator(TemplateHashModelEx)
静态 Util 类,即使对于非TemplateHashModelEx2
对象也可用于获取TemplateHashModelEx2.KeyValuePairIterator
。这简化了遍历键值对的 Java 代码。 -
freemarker.template.utility.DeepUnwrap
(一种很少使用的 Util)现在在解开的TemplateModel
实现TemplateHashModelEx2.getKeyValuePairIterator()
时使用,因此即使具有非字符串键,也可以解开此类哈希值。而且,它现在保留哈希的迭代 Sequences,因为它解开为LinkedHashMap
而不是普通的HashMap
。 -
freemarker.ext.beans.HashAdapter.size()
被覆盖以提高性能。 -
当incompatible_improvements setting设置为 2.3.28(或更高版本)时:修复了旧式解析器故障,即使标记语法设置为尖括号,该标记仍可以使用非法
]
关闭(当它不是表达式的一部分时)。例如<#if x]
就像<#if x>
一样工作。请注意,这种传统故障不会影响]
的合法用法,就像<#if x[0]>
始终可以正常工作一样。 -
修复了解析器错误,该错误不允许使用
>
作为内插(${...}
)内的顶级表达式。<#if x > y>
不能按天真预期的原因是相同的,但是${x > y}
没有 true 的歧义,因此现在可以使用。请注意,通常会打印布尔值的${(x > y)?c}
和${(x > y)?string('y', 'n')}
一直有效,因为>
操作不在插值内的顶层。 -
修复了扩展 Java 十进制格式分析错误消息中有效
roundingMode
-s 的错误列表
Other changes
- FreeMarker 毕业于 Apache Incubator(截至 2018-03-21),现在是 Apache 的常规顶级项目。因此,版本号不再包含“ -incubating”。