FreeMarker学习

FreeMarker是一个用Java编写的模板引擎,主要用来生成HTMLWeb页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,但不像PHP,通常由Java程序准备要显示的数据,由FreeMarker模板生成页面。FreeMarker可以作为Web应用框架一个组件,但它与容器无关,在非Web应用程序环境也能工作的很好。FreeMarker适合作为MVC的视图组件,还能在模板中使用JSP标记库。

<html>

<head>

<title>Welcome!</title>

</head>

<body>

<h1>Welcome${user}!</h1>

<p>Ourlatestproduct:

<ahref="${latestProduct.url}">${latestProduct.name}</a>!

</body>

</html>

上面的例子中,在简单的HTML中加入了一些由${…}包围的特定FreeMarker的指令,这个文件就称为模板了。而user、latestProduct.url和latestProduct.name来自于数据模型,由Java程序提供,模板设计者就不用关心数据从哪来的。

FreeMarker模板中可以包括下面四种特定部分:

一.)文本:直接输出

二.)FTL标记(FreeMarker模板语言标记):类似于HTML标记,名字前加#(有些以@开始,用户自定义标记)予以区分,不会输出。

字符串-使用单引号或双引号限定;如果包含特殊字符需要转义符:${"It's\"quoted\"andthisisabackslash:\\"}

有一类特殊的字符串:${r"C:\foo\bar"},输出结构为:C:\foo\bar,在引号前面加r被认为是纯文本。

数字-直接输入,不需要引号。${08},${+8},${8.00}and${8}都是相同的

布尔值-true和false,不使用引号

Sequences(序列)-由逗号分隔的变量列表,由方括号限定,类似java中的一维数组:

<#list["winter","spring","summer","autumn"]asx>

${x}

</#list>

输出结果:

winter

spring

summer

autumn

例二:[2+2,[1,2,3,4],"whatnot"]

例三:2..5,等同于[2,3,4,5];5..2,等同于[5,4,3,2]。注意方括号是不需要的。

Hashes(散列)-由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"greenmouse","price":150},键和值都是表达式,但是键必须是字符串。

获取变量-${variable},变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头。下列表达式是等价的:

book.author.name

book["author"].name

book.author.["name"]

book["author"]["name"]

获取Sequence(序列)片断-使用[startindex..endindex],例如:seq中存储了"a","b","c","d","e",那么seq[1..2]包含了b和c两个值。

可以使用.variablename语法访问FreeMarker内置变量。

字符串操作

{"Hello${user}!"}<==>${"Hello"+user+"!"}

${"${user}${user}${user}${user}"}<==>${user+user+user+user}

${…}只能在文本中使用,下面是错误的代码:

<#if${isBig}>Wow!</#if>

<#if"${isBig}">Wow!</#if>//此处的代码也是错误的,因为if指令需要的是boolean,实际的却是个字符串

子字符串的操作,假设user的值为"BigJoe":

${user[0]}${user[4]}<==>BJ

${user[1..4]}<==>igJ

Sequences(序列)操作

<#list["Joe","Fred"]+["Julia","Kate"]asuser>

-${user}

</#list>

结果:

-Joe

-Fred

-Julia

-Kate

Hashes(散列)操作

<#assignages={"Joe":23,"Fred":25}+{"Joe":30,"Julia":18}>

-Joeis${ages.Joe}

-Fredis${ages.Fred}

-Juliais${ages.Julia}

结果:

-Joeis30

-Fredis25

-Juliais18

算术运算

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

比较操作符-<#ifexpression>...</#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&amp;Jerry

TOM&amp;JERRY

例二:

<#--seasons的值为"winter","spring","summer","autumn"-->

${seasons?size}

${seasons[1]?cap_first}<#--leftsidecanbyanyexpression-->

${"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:由${...}或#{...}两种类型,输出计算值,可以定义输出的格式

例一:

<#settingnumber_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-ddHH:mm:sszzzz")}

${lastUpdated?string("EEE,MMMd,''yy")}

${lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")}

结果:

2003-04-0821:24:44PacificDaylightTime

Tue,Apr8,'03

Tuesday,April08,2003,09:24:44PM(PDT)

例三:

<#assignfoo=true/>

${foo?string("yes","no")}

结果:

yes

例四:

<#--xis2.582andyis4-->

#{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>Wehavetheseanimals:

<tableborder=1>

<tr><th>Name<th>Price

<#listanimalsasbeing>

<tr>

<td>

<#ifbeing.size="large"><b></#if>

${being.name}

<#ifbeing.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.)如果使用的指令不存在,会产生一个错误消息。

相关推荐