官方链接:http://freemarker.foofun.cn/ref_deprecated.html
目录
datetime for dates, for strings
number_to_date, number_to_datetime, number_to_time
string: for strings, for numbers, for booleans, for date/time/date-time
time for date/time/date-time, for strings
date, time, datetime (当用于日期/时间/日期-时间值时)
date_if_unknown, time_if_unknown, datetime_if_unknown
byte, double, float, int, long, short
number_to_date, number_to_time, number_to_datetime
User-defined directive (<@...>)
1.内建函数参考
1.1 字母顺序索引(重要)
在 FreeMarker 2.3.23 中,指令名可以使用驼峰样式来代替蛇形样式, 比如 startsWith
代替 starts_with
。 但是要知道,在相同模版内,FreeMarker 会强制对模板语言部分的所有标识符使用驼峰样式 (用户自定义名称不会受影响)。
该内建函数和 xml
内建函数的唯一不同是 xhtml
内建函数转义 '
为 '
,而不是 '
, 因为一些老版本的浏览器不能正确解释 '
-
abs
-
给出数字的绝对值。比如
x?abs
,如果x
是 -5,会得到5。 -
ancestors
-
一个包含所有结点祖先结点的序列,以直接父结点开始,以根结点结束。 该内建函数的结果也是一个方法,你可以用它和元素的 完全限定名 来过滤结果。 比如以名称
section
用node?ancestors("section")
来获得所有祖先结点的序列。 -
api
-
如果value本身支持这个额外的特性,
value?api
提供访问value
的API (通常是 Java API),比如value?api.someJavaMethod()
, 当需要调用对象的Java方法时,这种方式很少使用, 但是 FreeMarker 揭示的value的简化视图的模板隐藏了它,也没有相等的内建函数。 例如,当有一个Map
,并放入数据模型 (使用默认的对象包装器),模板中的myMap.myMethod()
基本上翻译成Java的((Method) myMap.get("myMethod")).invoke(...)
,因此不能调用myMethod
。如果编写了myMap?api.myMethod()
来代替,那么就是Java中的myMap.myMethod()
。 -
boolean
-
字符串转为布尔值。字符串必须是
true
或false
(大小写敏感!),或者必须是由boolean_format
设置的特定格式。 -
byte
-
返回一个包含原变量中相同值的
SimpleNumber
, 但是在内部表示值中使用了java.lang.Type
。 如果方法被重载了,这是有用的,或者一个TemplateModel
解包器在自动选择适合的java.lang.*
类型有问题时。 请注意,从2.3.9版本开始,解包器有本质上改进, 所以将基本不会使用到这些内建函数来转换数字类型了, 除非在重载方法调用中来解决一些含糊的东西。 -
内建函数
long
也可以用于日期, 时间和时间日期类型的值来获取返回为java.util.Date.getTime()
的值。如果你不得不调用使用long
类型时间戳的Java方法时, 这是非常有用的。这个转换不是自动进行的。 -
c for strings, for booleans
-
该内建函数将布尔值转换为字符串,针对 "计算机语言" 而不是用户。不管
boolean_format
的设置是什么, 结果是"true"
或"false"
。 当生成JavaScript的时候,应该会用到它,否则修改boolean_format
的话可以打断生成的计算机语言输出。 -
foo?string("yes", "no")
: 从 FreeMarker 2.3.23 版本开始废弃:使用?then("yes", "no")
来替代。如果布尔值是true, 这会返回第一个参数(此处是:"yes"
), 否则返回第二个参数(此处是:"no"
)。 请注意,返回值总是一个字符串;如果参数是数字,那么首先会转换成字符串。 也请注意,两个参数是评估过的,不管只有一个会被用到; 如果参数不仅仅是文字的话,这也许会有负面影响。 -
foo?string
: 从 FreeMarker 2.3.20 版本开始废弃:使用?c
来代替,或者设置boolean_format
设置项,比如像"yes,no"
,之后转换会自动发生。 如果仍然需要知道,这会转换布尔值为字符串,使用默认字符串来显示 true 和 false 值。默认情况下,true 被呈现为"true"
, 而 false 被呈现为"false"
。 如果使用 FreeMarker 来生成代码,这是很有用的 (但是从 2.3.20 版本开始, 请使用?c
),因为这些值不是非本地化(语言,国家)敏感的。 要修改这些默认设置,可以使用boolean_format
设置。 -
cap_first
-
字符串中的首单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。 例如:
-
-
capitalize
-
字符串中所有单词的首字母大写。 关于"单词"的准确意义,可以参考 word_list 内建函数。例如:
-
-
ceiling
-
ceiling
:返回数字小数进位后的整数 (也就是向正无穷进位) -
-
children
-
一个包含该结点所有子结点(也就是直接后继结点)的序列。
-
XML:这和特殊的哈希表的键
*
几乎是一样的。 除了它返回所有结点,而不但是元素。所以可能的子结点是元素结点, 文本结点,注释结点,处理指令结点等,但 不是 属性结点。属性结点排除在序列之外。 -
chop_linebreak
-
在末尾没有 换行符 的字符串, 那么可以换行,否则不改变字符串。
-
chunk
-
该内建函数将序列分隔为多个序列,长度为第一个参数给定的值 (比如
mySeq?chunk(3)
)。结果是包含这些序列的一个序列。 最后一个序列可能比给定的长度要小,除非第二个参数也给定了 (比如 比如mySeq?chunk(3, '-')
), 这就是用来填充最后一个序列,以达到给定的长度。例如: -
-
contains
-
如果函数中的参数指定的子串出现在源字符串中, 那么返回true。比如:
-
-
counter
-
返回当前迭代(由循环变量名称识别)从1开始的索引。
-
-
date for dates, for strings
-
这些内建函数用来指定日期变量中的哪些部分被使用:
-
date
:仅日期部分,没有一天当中的时间部分。 -
time
:仅一天当中的时间部分,没有日期部分。 -
datetime
:日期和时间都在 -
在最佳情况下,你不需要使用这些内建函数。不幸的是, 由于Java平台上的技术限制,FreeMarker 有时不能发现日期中的哪一部分在使用; 询问程序员哪些变量会有这个问题。如果 FreeMarker 不得不执行需要这些信息的操作 --比如用文本显示日期--但是它不知道哪一部分在使用,它会以错误来中止运行。 这就是你不得不使用这些内建函数的时候了。比如,假设
openingTime
是一个有这样问题的变量: -
-
date_if_unknown
-
date_if_unknown
,time_if_unknown
,datetime_if_unknown
内建函数使用一些子类型来标记日期类型的值:日期没有时间,时间,或日期-时间。 如果变量值已经持有这些信息,那么内建函数就不会起作用。也就是说, 它不会转换变量值的子类型,如果它是未知的,则会添加子类型。 -
datetime for dates, for strings
-
datetime_if_unknown
-
date_if_unknown
,time_if_unknown
,datetime_if_unknown
内建函数使用一些子类型来标记日期类型的值:日期没有时间,时间,或日期-时间。 如果变量值已经持有这些信息,那么内建函数就不会起作用。也就是说, 它不会转换变量值的子类型,如果它是未知的,则会添加子类型。 -
double
-
返回一个包含原变量中相同值的
SimpleNumber
, 但是在内部表示值中使用了java.lang.Type
。 如果方法被重载了,这是有用的,或者一个TemplateModel
解包器在自动选择适合的java.lang.*
类型有问题时。 请注意,从2.3.9版本开始,解包器有本质上改进, 所以将基本不会使用到这些内建函数来转换数字类型了, 除非在重载方法调用中来解决一些含糊的东西。 -
内建函数
long
也可以用于日期, 时间和时间日期类型的值来获取返回为java.util.Date.getTime()
的值。如果你不得不调用使用long
类型时间戳的Java方法时, 这是非常有用的。这个转换不是自动进行的。 -
ends_with
-
返回是否这个字符串以参数中指定的子串结尾。 比如
"ahead"?ends_with("head")
返回布尔值true
。"head"?ends_with("head")
也返回true
。 -
ensure_ends_with
-
如果字符串没有以第一个参数指定的子串结尾, 那么就会将它加到字符串后面,否则返回原字符串。比如,
"foo"?ensure_ends_with("/")
和"foo/"?ensure_ends_with("/")
返回"foo/"
。 -
ensure_starts_with
-
如果字符串没有以第一个参数指定的子串开头, 那么就会将它加到字符串开头,否则返回原字符串。比如,
"foo"?ensure_starts_with("/")
和"/foo"?ensure_starts_with("/")
返回"/foo"
。 -
如果指定两个参数,那么第一个参数就被解释成Java正则表达式, 如果它不匹配字符串的开头,那么第二个参数指定的字符串就会添加到字符串开头。 比如
someURL?ensure_starts_with("[a-zA-Z]+://", "http://")
就会检查如果字符串是否以"[a-zA-Z]+://"
开头 (请注意,不需要^
),如果不是的话,就添加"http://"
。 -
该方法也接受第三个标志位参数。因为调用两个参数暗指
"r"
(也就是正则表达式模式),那么就需要第三个参数了。 值得注意的一点是当不需要第一参数被解释成正则表达式,而只是普通文本, 但是又想让比较是大小写敏感的,那么此时就需要使用"i"
作为第三个参数。 -
eval
-
这个函数求一个作为FTL表达式的字符串的值。比如
"1+2"?eval
返回数字3。 -
在调用
eval
的地方, 已被求值的表达式看到相同的变量(比如本地变量)是可见的。 也就是说,它的行为就像在s?eval
处, 你有s
的 值。除了,指向在s
之外创建的循环变量,它不能使用 循环变量内建函数。 -
配置设置项影响来自
Configuration
对象表达式解析(比如语法),而不是来自调用eval
的的模板。 -
first
-
序列的第一个子变量。如果序列为空,那么模板处理将会中止。
-
floor
-
floor
:返回数字的舍掉小数后的整数 (也就是向负无穷舍弃) -
groups
-
这个函数只作用于内建函数
matches
的结果。请参考 这里...。 -
float
-
has_api
-
has_content
-
如果变量(不是Java的
null
) 存在而且不是"空"就返回true
,否则返回false
。"空”"含义靠具体的情形来决定。 它是直观的常识性概念。下面这些都是空:长度为0的字符串, 没有子变量的序列或哈希表,一个已经超过最后一项元素的集合。 如果值不是字符串,序列,哈希表或集合,如果它是数字,日期或布尔值 (比如0
和false
是非空的), 那么它被认为是非空的,否则就是空的。注意当你的数据模型实现了多个模板模型接口, 你可能会得到不是预期的结果。然而,当你有疑问时你通常可以使用expr!?size > 0
或expr!?length > 0
来代替expr?has_content
。 -
has_next
-
辨别循环项是否是当前迭代(由循环变量名称识别)的最后一项。
-
-
html
-
index
-
index_of
-
返回第一次字符串中出现子串时的索引位置。 例如
"abcabc"?index_of("bc")
将会返回1 (不要忘了第一个字符的索引是0)。而且,你可以指定开始搜索的索引位置:"abcabc"?index_of("bc", 2)
将会返回4。 这对第二个参数的数值没有限制:如果它是负数,那就和是0是相同效果了, 如果它比字符串的长度还大,那么就和它是字符串长度那个数值是一个效果。 小数会被切成整数。 -
如果第一个参数作为子串没有在该字符串中出现时 (如果你使用了第二个参数,那么就从给定的序列开始),那么就返回-1。
-
int
-
interpret
-
item_cycle
-
item_parity
-
item_parity_cap
-
is_even_item