On this page
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 之间发生了变化,它们现在以反斜杠开头。有点不对称的事实是,如果使用自然的大于或大于等于运算符(即>或> =),则表达式必须放在括号中。对于任何其他运算符,括号都是可选的。
在迭代循环中(即
foreach
或list
块),循环中的当前计数可用作特殊变量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.SimpleSequence
和freemarker.template.SimpleHash
现在不同步。如果需要同步方法,则可以通过任一类中的synchronizedWrapper()
获得同步包装器。删除了
freemarker.utility.ExtendedList
和freemarker.utility.ExtendedHash
类,因为现在可以使用适当的“?”来使用它定义的所有其他键。内置操作,即myHash?keys
或myList?size
或myList?last
。java.freemarker.Configuration
中有一个名为setDebugMode()
的方法,该方法使您可以决定是将堆栈跟踪简单地输出到 WebClient 端(开发中的最佳情况)还是扔回调用方以进行更优雅的处理(Producing 的最佳情况)。可以设置一个标志来打开与 FreeMarker Classic 更向后兼容的处理模式。默认情况下处于关闭状态,但是您可以通过
Template.setClassicCompatibility(true)
进行设置。这是因为它允许将标量视为 list 指令中的单项列表。另外,它还允许类型更加宽松。在 FreeMarker 1.x 中,<#if x=="1">
和<#if x==1>
实际上是等效的。这意味着旧版模板可能对此比较懈怠。如果未设置经典兼容性,则尝试将字符串“ 1”与数字 1 进行比较将导致引发异常。 (请注意,最好不要使用向后兼容标志来使模板正常工作,因为通常只需要进行较小的更改.但是,对于拥有大量模板并且没有时间检查它们的人来说,此标志可能有用.)