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