freemarker语法

一、常用语法  
EG.一个对象BOOK  
1、输出 $...{book.name}  
2、空值判断:$...{book.name?if_exists },  
                       $...{book.name?default(‘xxx’)}//默认值xxx  
                       $...{ book.name!"xxx"}//默认值xxx  
3、日期格式:$...{book.date?string('yyyy-MM-dd')}  
4、数字格式:$...{book?string.number}--20  
                       $...{book?string.currency}--<#-- $20.00 -->  
                       $...{book?string.percent}—<#-- 20% -->  
5、插入布尔值:  
                       <#assign foo=true />  
                       $...{foo?string("yes","no")} <#-- yes -->  

二、内置方法  
1、数字型  
                     <#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}.  

2、日期型:  
         预定义格式包括: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")}  

3、逻辑型  
                        foo?string  
                        foo?string("yes", "no")  
4、序列的内置方法:  
                        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经常用于分栏或者表格输出的格式。  
5、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 & Jerry  
TOM & 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值