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 %   -->
插入布尔值:
< #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"]>
<#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  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 .) 如果使用的指令不存在,会产生一个错误消息。

 

< # --  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

你可能感兴趣的:(freemarker语法)