freemarker语法开发指南
0
EG.一个对象BOOK 1.输出 $...{book.name} 空值判断:$...{book.name?if_exists }, $...{book.name?default(‘xxx’)}//默认值xxx $...{ book.name!"xxx"}//默认值xxx 日期格式:$...{book.date?string('yyyy-MM-dd')} 数字格式:$...{book?string.number}--20 $...{book?string.currency}--<#-- $20.00 --> $...{book?string.percent}—<#-- 20% --> 插入布尔值: <#assign foo=true /> $...{foo?string("yes","no")} <#-- yes --> 】内置方法
一:数字型
< #assign answer = 42 /> $ ... {answer} $ ... {answer?string} < # -- the same as $ ... {answer} --> $ ... {answer?string.number} $ ... {answer?string.currency} $ ... {answer?string.percent} < #setting number_format = " 0.###E0 " /> $ ... {12345?string("0.####E0")} $ ... {answer?string("number")} 等同于:$ ... {answer?string.number} . 二:日期型: 预定义格式包括: short ,middle和long。 $ ... {openingTime?string.short} $ ... {openingTime?string.medium} $ ... {openingTime?string.long} 组合使用:$ ... {lastUpdated?string.short_long} $ ... {lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} 三:逻辑型 foo ? string foo ? string( " yes " , " no " )
四:序列的内置方法:
first last seq_contains $ ... {x?seq_contains("blue")?string("yes", "no")} seq_index_of seq_last_index_of reverse size sort sort_by 多层次的hash排序 < #assign members = [ ... {"name": ...{"first": "Joe", "last": "Smith"}, "age": 40} , ... {"name": ...{"first": "Fred", "last": "Crooger"}, "age": 35} , ... {"name": ...{"first": "Amanda", "last": "Fox"}, "age": 25} ] > Sorted by name.last: < #list members ? sort_by([ ' name ' , ' last ' ]) as m > - $ ... {m.name.last} , $ ... {m.name.first} : $ ... {m.age} years old </ #list > chunk:将一个序列分解成几个序列。 < #assign seq = [ ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' ] > < #list seq ? chunk( 4 ) as row > < #list row as cell > $ ... {cell} </ #list > </ #list > < #list seq ? chunk( 4 , ' - ' ) as row > < #list row as cell > $ ... {cell} </ #list > </ #list > chunk经常用于分栏或者表格输出的格式。 五:hash内置方法: keys: values:
】序列 由逗号分隔的变量列表,由方括号限定,类似java中的一维数组 <#assign seq = ["winter", "spring", "summer", "autumn"]> <#if x_has_next>, </#list> 输出 】Hashes(散列)-由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"green mouse", "price":150},键和值都是表达式,但是键必须是字符串。
<
#assign ages
=
...
{"Joe":23, "Fred":25}
+
...
{"Joe":30, "Julia":18}
>
- Joe is $ ... {ages.Joe} - Fred is $ ... {ages.Fred} - Julia is $ ... {ages.Julia}
结果:
- Joe is 30 - Fred is 25 - Julia is 18
】freemarker的空值和默认值 ${user?if_exists} ${user?default('your name')} 判断对象是不是null 或<#if book.name?? > Mouse found
</#if>
list 空值判断 <#if bookList?size = 0> 】算术运算
比较操作符-
<
#
if
expression
>
...
</
#
if
>
1 .)使用 = (或 == ,完全相等)测试两个值是否相等,使用 != 测试两个值是否不相等 2 .) = 和 != 两边必须是相同类型的值,否则会产生错误,例如 < # if 1 = " 1 " > 会引起错误 3 .)Freemarker是精确比较,所以 " x " 、 " x " 和 " X " 是不相等的 4 .)对数字和日期可以使用 < 、 <= 、 > 和 >= ,但不能用于字符串 5 .)由于Freemarker会将 > 解释成FTL标记的结束字符,所以对于 > 和 >= 可以使用括号来避免这种情况,例如 < # if (x > y) > ,另一种替代的方法是,使用lt、lte、gt和gte来替代 < 、 <= 、 > 和 >= 逻辑操作符- && (and)、 || (or)、 ! (not),只能用于布尔值,否则会产生错误 < # if x < 12 && color = " green " > We have less than 12 things, and they are green. </ # if > < # if ! hot > < # -- here hot must be a boolean --> It ' s not hot. </ # if > 内置函数-用法类似访问hash(散列)的子变量,只是使用 " ? " 替代 " . " ,例如:user ? upper_case 下面列出常用的一些函数: 对于字符串 html-对字符串进行HTML编码 cap_first-使字符串第一个字母大写 lower_case-将字符串转换成小写 trim-去掉字符串前后的空白字符 对于Sequences(序列) size-获得序列中元素的数目 对于数字 int -取得数字的整数部分(如 - 1.9 ? int的结果是 - 1 ) 例一: < # -- test的值为Tom & Jerry --> $ ... {test?html} $ ... {test?upper_case?html} 结果: Tom & amp; Jerry TOM & amp; JERRY 例二: < # -- seasons的值为 " winter " , " spring " , " summer " , " autumn " --> $ ... {seasons?size} $ ... {seasons[1]?cap_first} < # -- left side can by any expression --> $ ... {"horse"?cap_first} 结果: 4 Spring Horse 方法的调用 $ ... {repeat("What", 3)} $ ... {repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case} 结果: WhatWhatWhat xxxxxxWHATWHATWHATWHAT 操作符优先顺序 |