(转)freemarker常用语法指南
常用语法
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%-->
插入布尔值:
<#assignfoo=true/>
$…{foo?string(”yes”,”no”)} <#-- yes -->】内置方法
一:数字型
<#assignanswer=42/>
$…{answer}
$…{answer?string}<#--thesameas$...{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}]>
Sortedbyname.last:
<#listmembers?sort_by(['name','last'])asm>
-$…{m.name.last},$…{m.name.first}:$…{m.age}yearsold
</#LIST>chunk:将一个序列分解成几个序列。
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<#listrowascell>$…{cell}</#LIST>
</#LIST><#list seq?chunk(4, '-') as row>
<#listrowascell>$…{cell}</#LIST>
</#LIST>
chunk经常用于分栏或者表格输出的格式。五:hash内置方法:
keys:values:
】序列 由逗号分隔的变量列表,由方括号限定,类似java中的一维数组
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#listseqasx>
${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}>
-Joeis$…{ages.Joe}
-Fredis$…{ages.Fred}
- Julia is $…{ages.Julia}结果:
-Joeis30
-Fredis25
- Julia is 18】freemarker的空值和默认值
${user?if_exists}
${user?default(’your name’)}
判断对象是不是null
<#ifmouse?exists>
Mousefound
<#else>或<#if book.name?? >
Mouse found
</#IF>list 空值判断 <#if bookList?size = 0>
】算术运算
比较操作符-<#if expression_r_r>…</#IF>
1.)使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
2.)=和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="1">会引起错误
3.)Freemarker是精确比较,所以”x”、”x“和”X”是不相等的
4.)对数字和日期可以使用<、<=、>和>=,但不能用于字符串
5.)由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>,另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=逻辑操作符-&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
<#ifx<12&&color="green">
Wehavelessthan12things,andtheyaregreen.
</#IF>
<#if!hot><#--herehotmustbeaboolean-->
It’snothot.
</#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&Jerry
TOM & JERRY例二:
<#-- seasons的值为"winter", "spring", "summer", "autumn" -->
$…{seasons?size}
$…{seasons[1]?cap_first}<#--leftsidecanbyanyexpression_r_r-->
$…{”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"/>
<#assignanswer=42/>
$…{answer}
$…{answer?string}<#--thesameas$...{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,MMMd,”yy”)}
$…{lastUpdated?string(”EEEE,MMMMdd,yyyy,hh:mm:ssa‘(’zzz’)'”)}
结果:
2003-04-0821:24:44PacificDaylightTime
Tue,Apr8,‘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位。四.) 注释:<#--和-->
下面是一个常用的模板例子:
We have these animals:
<#if being.size = "large"></#IF> $…{being.name} <#if being.size="large"></#IF> | $…{being.price} Euros </#LIST> |
<#i nclude "/copyright_footer.html">
注意点:
1.)FreeMarker是区分大小写的;
2.)FTL标记不能位于另一个FTL标记内部,例如:<#if<#include'foo'>=’bar’>…;
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<!-- -->