(转)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

<!-- -->

相关推荐