常用语法
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 -->
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 " )
< #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:
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"]>
<#list seq as x>
${x_index + 1}. ${x}
<#if x_has_next>,
</#list>
输出
1. winter,
2. spring,
3. summer,
4. autumn
】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 $ ... {ages.Joe}
- Fred is $ ... {ages.Fred}
- Julia is $ ... {ages.Julia}
结果:
- Joe is 30
- Fred is 25
- Julia is 18
- Joe is 30
- Fred is 25
- Julia is 18
】freemarker的空值和默认值
${user?if_exists}
${user?default('your name')}
判断对象是不是null
<#if mouse?exists>
Mouse found
<#else>
或<#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
操作符优先顺序
后缀 [subvarName] [subStringRange] . (methodParams)
一元 + expr、 - expr、 !
内建 ?
乘法 * 、 / 、 %
加法 + 、 -
关系 < 、 > 、 <= 、 >= (lt、lte、gt、gte)
相等 = 、 !=
逻辑 &&
逻辑 ||
数字范围 ..
三.) Interpolation:由$ ... {...} 或# ... {...} 两种类型,输出计算值,可以定义输出的格式
例一:
< #setting number_format = " currency " />
< #assign answer = 42 />
$ ... {answer}
$ ... {answer?string} < # -- the same as $ ... {answer} -->
$ ... {answer?string.number}
$ ... {answer?string.currency}
$ ... {answer?string.percent}
结果:
$ 42.00
$ 42.00
42
$ 42.00
4 , 200 %
例二:
$ ... {lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
$ ... {lastUpdated?string("EEE, MMM d, ''yy")}
$ ... {lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
结果:
2003 - 04 - 08 21 : 24 : 44 Pacific Daylight Time
Tue, Apr 8 , ' 03
Tuesday, April 08 , 2003 , 09 : 24 : 44 PM (PDT)
例三:
< #assign foo = true />
$ ... {foo?string("yes", "no")}
结果:
yes
例四:
< # -- x is 2.582 and y is 4 -->
# ... {x; M2} < # -- 2.58 -->
# ... {y; M2} < # -- 4 -->
# ... {x; m1} < # -- 2.6 -->
# ... {y; m1} < # -- 4.0 -->
# ... {x; m1M2} < # -- 2.58 -->
# ... {y; m1M2} < # -- 4.0 -->
说明:mX-小数部分最小X位;MX-小数部分最大X位。
四.) 注释: < # -- 和 -->
下面是一个常用的模板例子:
< p > We have these animals:
< table border = 1 >
< tr >< th > Name < th > Price
< #list animals as being >
< tr >
< td >
< # if being.size = " large " >< b ></ # if >
$ ... {being.name}
< # if being.size = " large " ></ b ></ # if >
< td > $ ... {being.price} Euros
</ #list >
</ table >
< #include " /copyright_footer.html " >
注意点:
1 .) FreeMarker是区分大小写的;
2 .) FTL标记不能位于另一个FTL标记内部,例如: < # if < #include ' foo ' >= ' bar ' > ... </ if > ;
3 .) $ ... {…} 只能在文本中使用;
4 .) 多余的空白字符会在模板输出时去除;
5 .) 如果使用的指令不存在,会产生一个错误消息。
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
操作符优先顺序
后缀 [subvarName] [subStringRange] . (methodParams)
一元 + expr、 - expr、 !
内建 ?
乘法 * 、 / 、 %
加法 + 、 -
关系 < 、 > 、 <= 、 >= (lt、lte、gt、gte)
相等 = 、 !=
逻辑 &&
逻辑 ||
数字范围 ..
三.) Interpolation:由$ ... {...} 或# ... {...} 两种类型,输出计算值,可以定义输出的格式
例一:
< #setting number_format = " currency " />
< #assign answer = 42 />
$ ... {answer}
$ ... {answer?string} < # -- the same as $ ... {answer} -->
$ ... {answer?string.number}
$ ... {answer?string.currency}
$ ... {answer?string.percent}
结果:
$ 42.00
$ 42.00
42
$ 42.00
4 , 200 %
例二:
$ ... {lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
$ ... {lastUpdated?string("EEE, MMM d, ''yy")}
$ ... {lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
结果:
2003 - 04 - 08 21 : 24 : 44 Pacific Daylight Time
Tue, Apr 8 , ' 03
Tuesday, April 08 , 2003 , 09 : 24 : 44 PM (PDT)
例三:
< #assign foo = true />
$ ... {foo?string("yes", "no")}
结果:
yes
例四:
< # -- x is 2.582 and y is 4 -->
# ... {x; M2} < # -- 2.58 -->
# ... {y; M2} < # -- 4 -->
# ... {x; m1} < # -- 2.6 -->
# ... {y; m1} < # -- 4.0 -->
# ... {x; m1M2} < # -- 2.58 -->
# ... {y; m1M2} < # -- 4.0 -->
说明:mX-小数部分最小X位;MX-小数部分最大X位。
四.) 注释: < # -- 和 -->
下面是一个常用的模板例子:
< p > We have these animals:
< table border = 1 >
< tr >< th > Name < th > Price
< #list animals as being >
< tr >
< td >
< # if being.size = " large " >< b ></ # if >
$ ... {being.name}
< # if being.size = " large " ></ b ></ # if >
< td > $ ... {being.price} Euros
</ #list >
</ table >
< #include " /copyright_footer.html " >
注意点:
1 .) FreeMarker是区分大小写的;
2 .) FTL标记不能位于另一个FTL标记内部,例如: < # if < #include ' foo ' >= ' bar ' > ... </ if > ;
3 .) $ ... {…} 只能在文本中使用;
4 .) 多余的空白字符会在模板输出时去除;
5 .) 如果使用的指令不存在,会产生一个错误消息。
<
#
--
x的值设定为5
-->
$ ... {x * x - 100}
$ ... {x / 2}
$ ... {12 % 10}
结果:
- 75
2.5
2
注意: 操作符两边必须是数字;使用 " + " 时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。
使用内建的指令int获得整数部分:
$ ... {(x/2)?int}
$ ... {1.1?int}
$ ... {1.999?int}
$ ... {-1.1?int}
$ ... {-1.999?int}
结果:
2
1
1
- 1
- 1
$ ... {x * x - 100}
$ ... {x / 2}
$ ... {12 % 10}
结果:
- 75
2.5
2
注意: 操作符两边必须是数字;使用 " + " 时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。
使用内建的指令int获得整数部分:
$ ... {(x/2)?int}
$ ... {1.1?int}
$ ... {1.999?int}
$ ... {-1.1?int}
$ ... {-1.999?int}
结果:
2
1
1
- 1
- 1