2.3.26 (在 Apache 孵化)

Page Contents

发布日期:2017-03-25

这是一个稳定的最终版本. 在该项目成为完全被接受(分级)的 Apache 项目之前,Apache Software Foundation 要求使用“ incubating”后缀。

FTL 方面的更改

  • 添加了node?next_siblingnode?previous_sibling以在节点树(see reference...)中横向移动。这适用于 XML DOM 节点或任何自定义TemplateNodeModelEx实现。

  • 向 XML DOM 模型添加了新的@@键:@@next_sibling_element@@previous_sibling_element。如果这是一个元素,它们将获得同级节点,另外,它们会静默跳过它们之间的任何空白文本以及 Comments 和处理指令。 (有关@@here...的更多信息)

  • 已修复错误(FREEMARKER-42):?first现在可用于 FTL 集合(可以列出但不支持按索引获取项目的项目),不仅适用于序列。实际的重要性在于,现在?first始终可以在 Java Set -s 上运行(这对于具有明确定义 Sequences 的Set -s 很有用),而更早的时候它因object_wrapper配置设置而失败。

Java 方面的更改

  • FREEMARKER-24:添加了解决方法(默认情况下未启用),以将 Java 8 默认方法(及其定义的 Bean 属性)公开给模板,尽管java.beans.Introspector(官方 JavaBeans 内省员)至少在 JRE 1.8.0_66 之前都忽略了它们。要启用此替代方法,请将DefaultObjectWrapperBeansWrapperincompatibleImprovements构造函数参数的值增加到 2.3.26,或将treatDefaultMethodsAsBeanMembers设置设置为true。请注意,如果将Configurationobject_wrapper设置保留为默认设置,则足以将ConfigurationincompatibleImprovements设置增加至 2.3.26,因为默认设置object_wrapper继承了该设置。

  • 添加了freemarker.template.TemplateNodeModelEx接口,该接口使用两种方法TemplateNodeModelEx getNextSibling()TemplateNodeModelEx getPreviousSibling()方法扩展了TemplateNodeModel实例。模板中的node?next_siblingnode?previous_sibling要求这样做。 FreeMarker 的标准 W3C DOM 节点包装器已经实现了此新接口。

  • 使得+运算符在添加两个哈希时的速度显着提高(可以消除引发的开销,然后捕获异常)。

  • 当有人尝试获取 XML DOM 节点的无效@@...子变量时,会出现更好的错误消息。 (现在,它不是由 XPath 实现发布的,XPath 实现只是将其视为语法错误.)

  • 为配置设置添加了Configuration.isXxxExplictlySetConfiguration.unsetXxx方法:localetime_zonedefault_encoding。 (可以在框架中使用它来检测应用程序是否错过了设置这些设置.向后兼容的默认值通常是不需要的,因为它们是 Java 环境的默认语言环境,时区和文件编码.)

  • 现在,从 Java .properties文件,通过Configuration.setSettings(Properties)或通过#setting指令设置时,localedefault_encoding配置设置支持特殊的"JVM default"值。先前只有time_zone设置支持该值。

  • 错误修正:META-INF/MANIFEST.MF中的 OSGi Bundle-RequiredExecutionEnvironment条目错误地指出最低要求版本是J2SE-1.4,而实际上是J2SE-1.5。利用率最高的版本也提高到JavaSE-1.8

  • 错误修正:如果incompatible_improvements 设置设置为 2.3.26(或更高),则exp?interpret总是从调用它的模板中获取与解析器相关的设置。以前,有时它是从最顶层(主)模板中获取的。同样,?interpret创建的模板的生成名称将始终引用从中调用模板的模板。

  • 错误修复:MultiTemplateLoader处于粘滞模式(默认设置),并且上次成功用于给定名称的TemplateLoader现在找不到模板(我们称其为粘滞TemplateLoader),因此MultiTemplateLoader退回到按 Sequences 尝试所有TemplateLoader -s,现在将跳过粘贴的TemplateLoader,因为在同一MultiTemplateLoader.findTemplateSource调用中已经尝试过此操作。

  • 错误修复:NodeModel.mergeAdjacentText(Node)并未合并所有相邻的文本节点,仅合并了成对的相邻文本节点。 (幸运的是,这种方法几乎从未使用过,更常用的NodeModel.simplify(Node)可以正常工作.)

  • NodeModelsimplify(Node)mergeAdjacentText(Node)removeComments(Node)removePIs(Node)的静态 Util 方法中的性能改进。

  • NodeModel.parse方法的 JavaDoc 中添加了警告,以通知用户有关 XML 外部实体(XXE)攻击的可能性,如果源 XML(而非模板)来自不受信任的源。这只是 XML 的事实(即,在 XML 中,您可以具有外部实体,并且可以利用它们),而与 FreeMarker 无关。另请注意,FreeMarker 本身从不调用NodeModel.parse;这些只是便捷的方法,一些应用程序直接调用它们自己以从 XML 文件创建NodeModel。由于此方法封装了对平台 XML 解析器的调用,因此我们认为最好指出这种风险。

  • DefaultObjectWrapper仅将incompatible_improvements设置为 2.3.26(看看这里如何...),会将java.util.Enumeration -s 包装到freemarker.template.DefaultEnumerationAdapter(一个新类)中,而不是freemarker.ext.beans.EnumerationModel中(只要useAdaptersForContainerstrue,这是默认值)。该适配器比EnumerationModel干净,因为它仅实现了最低要求的 FTL 类型,从而避免了一些歧义的情况。 (请注意,Java API 方法不再作为子变量公开;如果确实需要它们,则可以使用?api)。

  • DefaultIteratorAdapter现在支持?api。事实并非如此。

  • Configuration.setSetting(String, String)setSettings现在允许template_loadernull值(因为Configuration.setTemplateLoader(null)也允许了一段时间)。

  • freemarker.template.TemplateCollectionModelEx接口不再处于实验状态,因此现在具有向后兼容性保证。请注意,TemplateCollectionModelEx.contains(TemplateModel)方法已从其中删除。

  • freemarker.template.DefaultNonListCollectionAdapter类不再是实验性的,因此现在具有向后兼容性的保证。

  • BeansWrapperConfiguration.classIntrospectorFactory不再是受保护的字段,而是私有字段。特别是由于该字段(ClassIntrospectorBuilder)的类是包私有的,因此可以肯定没有人依赖此字段。

  • 各种较小的代码清除。

Other changes

  • FREEMARKER-17:删除了与 Servlet 和 JSP 相关的*.dtd文件,以简化许可。我们可以像以前一样在没有它们的情况下进行操作,因为与它们的验证也早些时候就被禁用了。此时,FreeMarker 引擎的源代码中的所有内容以及生成的freemarker.jar中的所有内容均在 FreeMarker 项目中创建。

  • FREEMARKER-27:将某些内容从NOTICES文件移到LICENSE文件,以更严格地遵循 Apache Incubator 准则。

  • 各种较小的 JavaDoc 改进。