2.3.28

Page Contents

发布日期:2018-04-04

FTL 方面的更改

  • 添加了新的special variableget_optional_template(FREEMARKER-84)。当您需要包括或导入可能丢失的模板,并且需要以某种特殊方式处理这种情况时,可以使用它。 在这里查看详细信息...

  • 添加了新的special variablecaller_template_name(FREEMARKER-83),它们返回从中调用当前宏或函数的模板的名称(路径)。如果您要解析相对于调用者模板的路径,则它最有用。

  • 添加了新的内置templateName?absolute_template_nametemplateName?absolute_template_name(baseName),可用于将相对模板名称转换为绝对模板名称。 在这里查看更多...

  • 添加了新的内置函数:sequence?minsequence?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(例如ConfigurationTemplateConfiguration)设置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.MethodAppearanceDecisionreplaceExistingProperty添加了新属性。当通过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)的主体(嵌套内容)中出现了不是TemplateModelExceptoinTemplateException,则导致异常处理代码中出现了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”。