2.3.1

Page Contents

发布日期:2005-01-04

维护(具有一些重要的新功能)和错误修正版本。

可能的向后兼容性问题

如果在 FreeMarker 模板中使用 JSP 标记,则存在一个可能会影响 Web 应用程序行为的错误修正:FreeMarker 的javax.servlet.jsp.PageContext.getSession()实现不正确。 getSession()方法是一种方便的方法,自定义标记可通过该方法获取当前的HttpSession对象(如果没有会话,则为null)。到现在为止,如果会话不存在,那么它将自动创建它,因此它永远不会返回null。这是一个错误,因此从 2.3.1 开始,它从不创建会话,如果不存在则仅返回null。如果部分刷新页面后调用此方法,则旧的不正确行为可能导致页面渲染失败。但是要当心,旧的行为可能隐藏了 Web 应用程序的一些错误,从而忘记了创建会话的位置,因此使用新的正确行为,您可能会遇到由 Web 应用程序先前隐藏的错误引起的故障。 (创建会话是 MVC 控制器的任务,除非编写了需要会话的 JSP 标记,以便它自动创建它,但并不希望getSession()会这样做.)

FTL 方面的更改

  • 全新内置:url。此内置可用于 URL 转义。但是请注意,要方便地使用此内置功能,封装 FreeMarker 的软件必须具有 2.3.1 意识(程序员将在下面找到更多信息...)。

  • 新的special variablesoutput_encodingurl_escaping_charset。但是请注意,要使用这些软件,封装 FreeMarker 的软件必须具有 2.3.1 意识(程序员将在下面找到更多信息...)。

  • 序列的新内置函数:seq_containsseq_index_ofseq_last_index_of

  • 字符串的新内置函数:left_padright_padcontains

  • 新指令:attempt/recover

  • js_string built-in现在以\>的身份转义了>(以避免</script>)。

  • 内置sortsort_by现在可以按日期值排序。此外,对于任何级别的深度,内置的sort_by现在都可以按子变量的子变量排序...等等。 (Details...)

  • freemarker.template.TemplateExceptionHandler.HTML_DEBUG_HANDLER现在可以打印更多 HTML 上下文验证消息。

Java 方面的更改

  • 新设置:output_encoding。此设置用于通知 FreeMarker 有关封闭软件(作为 Web 应用程序框架)用于 FreeMarker 输出的字符集。默认情况下它是未定义的,尽管不是严格要求设置的,但随附的软件应该这样做。如果模板要使用新的output_encoding特殊变量,并且可能要使用新的内置url,则必须设置此设置。请注意,FreeMarker API 允许您分别为每个模板执行设置设置(请参见Template.createProcessingEnvironment(...))。

  • 新设置:url_escaping_charset。当您使用新的内置url进行 URL 转义时,这是用于计算转义部分(%XX)的字符集。如果未设置,则url内置值将使用output_encoding设置的值,如果也未设置,则不能使用url内置值(${foo?url})的无参数版本。

  • 使用单例(静态)Configuration实例显然是一个坏习惯,因此现在不赞成使用相关方法,并已对《手册》进行了调整,同时也更新了FreemarkerXmlTask

  • 添加了freemarker.template.utility.Constants类,该类包含各种静态 final 字段,这些字段存储着常用的TemplateModel常数,例如EMPTY_SEQUENCEZERO等。

  • SecurityManager与 FreeMarker 一起使用时,访问系统属性可能会导致 AccessControlException。现在,将捕获此类异常并以警告级别对其进行记录,并返回该属性的默认值。

  • 在某些情况下,现在从异常原因跟踪中删除了针InvocationTargetException

  • 添加了一个肮脏的 hack,尽管ServletException类编写得不好,但如果TemplateException的直接原因是异常,它会在TemplateException的堆栈跟踪中显示ServletException根本原因。

  • 错误修正:FreeMarker 的javax.servlet.jsp.PageContext.getSession()实现不正确。 getSession()方法是一种方便的方法,自定义标记可通过该方法获取当前的HttpSession对象(如果没有会话,则为null)。到现在为止,如果会话不存在,那么它将自动创建它,因此它永远不会返回null。这是一个错误,因此从 2.3.1 开始,它从不创建会话,如果不存在则仅返回null。如果部分刷新页面后调用此方法,则旧的不正确行为可能导致页面渲染失败。但是要当心,旧的行为可能隐藏了 Web 应用程序的一些错误,从而忘记了创建会话的位置,因此使用新的正确行为,您可能会遇到由 Web 应用程序先前隐藏的错误引起的故障。 (创建会话是 MVC 控制器的任务,除非编写了需要会话的 JSP 标记,以便它自动创建它,但并不希望getSession()会这样做.)

  • 错误修正:对于同时具有公共静态字段和相同名称的公共静态方法的 Java 类,BeansWrapper并非总是能正确处理。

  • 错误修正:SimpleMethodModel有时会错误地传播异常,从而导致空指针异常。

  • 错误修正:当您多次处理相同的Environment并在两次处理之间更改了设置时,模板执行可能会使用过期的缓存值。请注意,这仅在允许修改设置的单线程环境中可能发生。

  • 错误修正:如果模板作者忘记指定必需的参数,则某些内置字符串会因IndexOutOfBounds异常而终止。现在他们死于更多有用的错误消息。

  • 错误修正:freemarker.ext.dom.NodeModel.equals(...)如果参数为null,则死于空指针异常。

  • 错误修正:在 J2SE 1.4 或更高版本中,有时在堆栈跟踪中将TemplateException -s 的原因异常打印了两次。

  • 错误修正:StringUtil.FTLStringLiteralEnc(String)方法已完成。

Other changes

  • 手册和 JavaDoc API 中的修复和改进。

最终版本之前的发行记录

预览版本与最终版本之间的差异

  • 添加了一个肮脏的 hack,尽管ServletException类编写得不好,但如果TemplateException的直接原因是异常,它会在TemplateException的堆栈跟踪中显示ServletException根本原因。

  • 错误修正:freemarker.ext.dom.NodeModel.equals(...)如果参数为null,则死于空指针异常。

  • 错误修正:在 J2SE 1.4 或更高版本中,有时在堆栈跟踪中将TemplateException -s 的原因异常打印了两次。

  • 手册中还有一些较小的改进。