2.0 RC2

Page Contents

FreeMarker 2.0 RC 2 于 2002 年 4 月 4 日发布。这是对第一个发行版的更改的摘要。

模板语言的更改

  • 通过新的运算符“?”提供了某些内置功能。因此,myList?size提供列表中元素的数量。类似地,myString?length提供字符串的长度,myString?upper_case将字符串全部以大写字母表示,myHash?keys提供包含哈希键的序列。有关所有可用内置程序的列表,请参见模板语言参考/内置参考

  • 现在可以使用“自然”运算符\ < and >进行数值比较,但也存在“网络安全”替代方法,例如*\lt \gt *,因为使用这些字符可能会使 HTML 编辑器和解析器感到困惑。注意,这些在 rc1 和 rc2 之间发生了变化,它们现在以反斜杠开头。有点不对称的事实是,如果使用自然的大于或大于等于运算符(即>或> =),则表达式必须放在括号中。对于任何其他运算符,括号都是可选的。

  • 在迭代循环中(即foreachlist块),循环中的当前计数可用作特殊变量index_count。其中* index *是迭代中变量的名称。还定义了一个名为index_has_next的布尔变量,该变量指示在此之后的迭代中是否还有其他项。请注意,索引从零开始,因此在实践中通常会向其添加一个。

  • 现在可以使用<#break>指令来中断<#foreach...><list...>循环。 (在此版本之前,它仅在 switch-case 块中起作用.)有一个名为<#stop>的新指令,遇到该指令时,它只会暂停模板的处理。这对于调试目的很有用。

  • 当使用 freemarker.ext.*中的代码调用页面中公开的 Java 方法时,内置有一些内建函数,可让您将希望传递的数字类型指定为值。例如,如果您有两个方法,一个方法需要一个 int 值,另一个方法则需要很长的时间,并且您想传递一个值,则必须指定哪个方法。 myMethod(1?int)myMethod(1?long)。如果只有一种给定名称的方法,则没有必要。

  • 范围可用于从列表或字符串的子字符串中获取子列表。例如:myList[0..3]将返回相关列表中的项目 0 到 3.或者,例如,您可以通过myList[1..(myList?size-2)]获取列表中除第一个和最后一个元素之外的所有元素。

  • 或者我们可以通过myString[0..5]获得字符串的前 6 个字符

  • 列表可以使用''运算符连接。以前,此''重载仅适用于字符串。

  • 现在尝试将数字与字符串进行比较会引发异常,因为它表示编码错误。请注意,可以设置一个向后兼容模式(请参阅下文),以放松该模式以便能够处理旧版模板。

API Changes

  • TemplateSequenceModel接口现在具有size()方法,用于获取所讨论序列中的元素数量。

  • TemplateModelIterator界面现在具有hasNext()方法。

  • 默认序列和哈希实现freemarker.template.SimpleSequencefreemarker.template.SimpleHash现在不同步。如果需要同步方法,则可以通过任一类中的synchronizedWrapper()获得同步包装器。

  • 删除了freemarker.utility.ExtendedListfreemarker.utility.ExtendedHash类,因为现在可以使用适当的“?”来使用它定义的所有其他键。内置操作,即myHash?keysmyList?sizemyList?last

  • java.freemarker.Configuration中有一个名为setDebugMode()的方法,该方法使您可以决定是将堆栈跟踪简单地输出到 WebClient 端(开发中的最佳情况)还是扔回调用方以进行更优雅的处理(Producing 的最佳情况)。

  • 可以设置一个标志来打开与 FreeMarker Classic 更向后兼容的处理模式。默认情况下处于关闭状态,但是您可以通过Template.setClassicCompatibility(true)进行设置。这是因为它允许将标量视为 list 指令中的单项列表。另外,它还允许类型更加宽松。在 FreeMarker 1.x 中,<#if x=="1"><#if x==1>实际上是等效的。这意味着旧版模板可能对此比较懈怠。如果未设置经典兼容性,则尝试将字符串“ 1”与数字 1 进行比较将导致引发异常。 (请注意,最好不要使用向后兼容标志来使模板正常工作,因为通常只需要进行较小的更改.但是,对于拥有大量模板并且没有时间检查它们的人来说,此标志可能有用.)