2.3.26 (在 Apache 孵化)
Page Contents
发布日期:2017-03-25
这是一个稳定的最终版本. 在该项目成为完全被接受(分级)的 Apache 项目之前,Apache Software Foundation 要求使用“ incubating”后缀。
FTL 方面的更改
-
添加了
node?next_sibling
和node?previous_sibling
以在节点树(see reference...)中横向移动。这适用于 XML DOM 节点或任何自定义TemplateNodeModelEx
实现。 -
向 XML DOM 模型添加了新的
@@
键:@@next_sibling_element
,@@previous_sibling_element
。如果这是一个元素,它们将获得同级节点,另外,它们会静默跳过它们之间的任何空白文本以及 Comments 和处理指令。 (有关@@
键here...的更多信息) -
已修复错误(FREEMARKER-42):
?first
现在可用于 FTL 集合(可以列出但不支持按索引获取项目的项目),不仅适用于序列。实际的重要性在于,现在?first
始终可以在 JavaSet
-s 上运行(这对于具有明确定义 Sequences 的Set
-s 很有用),而更早的时候它因object_wrapper
配置设置而失败。
Java 方面的更改
-
FREEMARKER-24:添加了解决方法(默认情况下未启用),以将 Java 8 默认方法(及其定义的 Bean 属性)公开给模板,尽管
java.beans.Introspector
(官方 JavaBeans 内省员)至少在 JRE 1.8.0_66 之前都忽略了它们。要启用此替代方法,请将DefaultObjectWrapper
或BeansWrapper
的incompatibleImprovements
构造函数参数的值增加到 2.3.26,或将treatDefaultMethodsAsBeanMembers
设置设置为true
。请注意,如果将Configuration
的object_wrapper
设置保留为默认设置,则足以将Configuration
的incompatibleImprovements
设置增加至 2.3.26,因为默认设置object_wrapper
继承了该设置。 -
添加了
freemarker.template.TemplateNodeModelEx
接口,该接口使用两种方法TemplateNodeModelEx getNextSibling()
和TemplateNodeModelEx getPreviousSibling()
方法扩展了TemplateNodeModel
实例。模板中的node?next_sibling
和node?previous_sibling
要求这样做。 FreeMarker 的标准 W3C DOM 节点包装器已经实现了此新接口。 -
使得
+
运算符在添加两个哈希时的速度显着提高(可以消除引发的开销,然后捕获异常)。 -
当有人尝试获取 XML DOM 节点的无效
@@...
子变量时,会出现更好的错误消息。 (现在,它不是由 XPath 实现发布的,XPath 实现只是将其视为语法错误.) -
为配置设置添加了
Configuration.isXxxExplictlySet
和Configuration.unsetXxx
方法:locale
,time_zone
,default_encoding
。 (可以在框架中使用它来检测应用程序是否错过了设置这些设置.向后兼容的默认值通常是不需要的,因为它们是 Java 环境的默认语言环境,时区和文件编码.) -
现在,从 Java
.properties
文件,通过Configuration.setSettings(Properties)
或通过#setting
指令设置时,locale
和default_encoding
配置设置支持特殊的"JVM default"
值。先前只有time_zone
设置支持该值。 -
错误修正:
META-INF/MANIFEST.MF
中的 OSGiBundle-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)
可以正常工作.) -
NodeModel
:simplify(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
中(只要useAdaptersForContainers
是true
,这是默认值)。该适配器比EnumerationModel
干净,因为它仅实现了最低要求的 FTL 类型,从而避免了一些歧义的情况。 (请注意,Java API 方法不再作为子变量公开;如果确实需要它们,则可以使用?api
)。 -
DefaultIteratorAdapter
现在支持?api
。事实并非如此。 -
Configuration.setSetting(String, String)
和setSettings
现在允许template_loader
的null
值(因为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 改进。