freemaker基础

来源 http://demojava.iteye.com/blog/800204

组成
1,文本
2,注释<#-- 注释部分 -->
3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
4,FTL指令:名字前面加#
<#-- 使用FTL指令 -->
<#list animals as being><br>
   <li>${being.name} for ${being.price} Euros<br>
<#list><br>

FTL规则
1使用标签时用户指令用@,系统指令用#
FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符.
2插值规则
1)通用插值${expr}

2)
(1)数字格式化插值#{expr},#{expr,format}
<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%
(2)数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出2.6 -->
#{y; m2} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出2.58 -->
#{x; m1M2} <#-- 输出4.0 -->

3,插值结果为日期值:根据默认格式(由#setting指令设置)
${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')'")}
输出结果是:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)

4插值结果为布尔值:根据默认格式(由#setting指令设置)
<#assign foo=true/>
${foo?string("yes", "no")}
输出结果是:
yes

3表达式
3.1直接指定值,让FreeMarker直接输出插值中的值,注意转义
	${'我名字是\"annlee\"'}
3.2数值
	1,数值不能省略小数点前面的0,所以".5"是错误的写法
	2,数值8 , +8 , 8.00都是相同的
3.3布尔值
	直接使用true和false,不使用引号.
3.4集合
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x}
</#list>

5.Map对象
5.1顶层变量
	所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:
	Map root = new HashMap();   //创建数据模型
	root.put("name","annlee");   //name是一个顶层变量	对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:
	${name}

5.2输出集合元素
	如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:(类似数组)
	["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:
	${week[2]}   //输出第三个集合元素
	此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:
	week[3..5]   //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素

5.3输出map元素,支持:点语法和方括号法
	book.author.name    //全部使用点语法
	book["author"].name
	book.author["name"]    //混合使用点语法和方括号语法
	book["author"]["name"]   //全部使用方括号语法

5.4字符串操作
下面将user变量和常量连接起来:
${"hello, ${user}!"}   //使用第一种语法来连接
${"hello, " + user + "!"} //使用+号来连接

5.5Map连接运算符
	Map对象的连接运算符+ 也可以将两个Map对象连接成一个新的Map对象,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子:
	<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
	语文成绩是${scores.语文}
	数学成绩是${scores.数学}
	Java成绩是${scores.Java}
	输出结果是:
	语文成绩是86
	数学成绩是87
	Java成绩是93

5.6支持算术运算符

5.7空值处理运算符
	FreeMarker对空值的处理非常严格,没有被赋值的变量就会抛出异常
	!:指定缺失变量的默认值,variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.
	??:判断某个变量是否存在

4FTL常用指令
4.1 if
	<#assign age=23>
	<#if (age>60)>老年人
	<#elseif (age>40)>中年人
	<#elseif (age>20)>青年人
	<#else> 少年人
	</#if>

4.2 switch , case , default , break指令
	<#switch value>
	<#case refValue>...<#break>
	<#case refValue>...<#break>
	<#default>...
	</#switch>

4.3 list,break
	<#list sequence as item>
	...
	</#list>

4.4include指令的作用类似于JSP的包含指令,
4.5mport指令 该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/common.ftl" as com>
4.6 noparse指令指定FreeMarker不处理该指定里包含的内容

4.7escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值
<#escape x as x?html>
First name:${firstName}
Last name:${lastName}
Maiden name:${maidenName}
</#escape>
上面的代码等同于:
First name:${firstName?html}
Last name:${lastName?html}
Maiden name:${maidenName?html}
escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子:
<#escape x as x?html>
Customer Name:${customerName}
Items to ship;
<#escape x as itemCodeToNameMap[x]>
   ${itemCode1}
   ${itemCode2}
   ${itemCode3}
   ${itemCode4}
</#escape>
</#escape>
上面的代码类似于:
Customer Name:${customerName?html}
Items to ship;
${itemCodeToNameMap[itemCode1]?html}
${itemCodeToNameMap[itemCode2]?html}
${itemCodeToNameMap[itemCode3]?html}
${itemCodeToNameMap[itemCode4]?html}

对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式.

4.8.8 assign指令
	assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量
	
4.9 setting指令
	该指令用于设置FreeMarker的运行环境
4.10 macro , nested , return指令
#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
例子:
<#macro book booklist>     //定义一个自定义指令booklist是参数
<#list booklist as book>
   ${book}
</#list>
</#macro>
<@book booklist=["spring","j2ee"] />   //使用刚刚定义的指令
上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee

 

posted @ 2015-04-30 17:03  EPHUIZI  阅读(110)  评论(0编辑  收藏  举报