??xml version="1.0" encoding="utf-8" standalone="yes"?>
创徏一?STRONG>DbUnit Test Case
。。?BR>
参数Q在macro指o中可以在宏变量之后定义参?BR>例二Q?BR><#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
使用Q?lt;@greet person="Fred"/> and <@greet person="Batman"/>
l果Q?<font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font>
macro可以有多个参敎ͼ参数的次序是无关的,在macro指o中只能用定义的参数Qƈ且必d所有参数赋|可以在定义参数时指定~省|
在自定义指o嵌套内容Q模板片断中使用<#nested>指o
使用Q?lt;@border>The bordered text</@border>
l果Q?/P>
<#nested>指o可以被多ơ调用:
使用Q?BR><@do_thrice>Anything.</@do_thrice>
l果Q?BR>Anything.
Anything.
Anything.
注意Q嵌套内Ҏ无法讉K到macro中的局部变量的?BR>例如Q?/P>
l果Q?BR>test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
下面是一个嵌套用自定义指o的例子:
l果Q?/P>
在macro?STRONG>使用循环变量Q作为nested指o的参C递@环变量的实际|而在调用用户定义指oӞ?lt;@?gt;开始标记的参数后面指定循环变量的名字:
l果Q?BR>1. 0.5
2. 1
3. 1.5
4. 2 Last!
注意Q@环变量和用户定义指o开始标记指定的数目可以不同Q调用时指定@环变量,则多指定的g可见Q调用时多指定@环变量,多余的@环变量不会被创徏?BR> 用assign指o创徏和替换的例子Q?/P>
l果Q?BR>1 局部变量隐?而不是覆?同名的plain变量Q@环变量隐藏同名的局部变量和plain变量Q下面是一个例子: l果Q?BR>1. plain 内部循环变量隐藏同名的外部@环变量,例如Q?/P>
l果Q?BR>loop 1 模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用Ҏ变量globalQ下面的例子假设数据模型中的user的值是Big JoeQ?/P>
命名(namespaces)I间Q通常情况Q只使用一个命名空_UCؓd名空?main namespace)Q但你是不会意识到这些的Qؓ了创建可重用的macro、transforms或其它变量的集合(通常U库)Q必M用多命名I间Qؓ了防止同名冲H?/P>
首先创徏一个库(假设保存在lib/my_test.ftl?Q?/P>
使用import指o导入库到模板中,Freemarker会ؓ导入的库创徏新的命名I间Qƈ可以通过import指o中指定的hash(散列)变量讉K库中的变量: l果Q?/P>
上面的例子中使用的两个同名变量ƈ没有冲突Q因为它们位于不同的命名I间 可以使用assign指o在导入的命名I间中创建或替代变量Q?/P>
l果Q?BR>jsmith@acme.com 数据模型中的变量M地方都可见,也包括不同的命名I间Q下面修改了刚才创徏的库Q?/P>
假设数据模型中的user变量的值是FredQ?/P>
l果Q?BR> <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>
模板中的变量Q有三种cdQ?BR>1.) plain(全局)变量Q可以在模板的Q何地方访问,包括使用include指o插入的模板,使用assign指o创徏和替?BR>2.) 局部变?/STRONG>Q在macro中有效,使用local指o创徏和替?BR>3.) 循环变量Q只能存在于指o的嵌套内容,由指?如list)自动创徏Q宏的参数是局部变量,而不是@环变?/P>
<#assign x = 1> <#-- create variable x -->
${x}
<#assign x = x + 3> <#-- replace variable x -->
${x}
4<#assign x = "plain">
1. ${x} <#-- we see the plain var. here -->
<@test/>
6. ${x} <#-- the value of plain var. was not changed -->
<#list ["loop"] as x>
7. ${x} <#-- now the loop var. hides the plain var. -->
<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->
8. ${x} <#-- it still hides the plain var. -->
</#list>
9. ${x} <#-- the new value of plain var. -->
<#macro test>
2. ${x} <#-- we still see the plain var. here -->
<#local x = "local">
3. ${x} <#-- now the local var. hides it -->
<#list ["loop"] as x>
4. ${x} <#-- now the loop var. hides the local var. -->
</#list>
5. ${x} <#-- now we see the local var. again -->
</#macro>
2. plain
3. local
4. loop
5. local
6. plain
7. loop
8. loop
9. plain2<#list ["loop 1"] as x>
${x}
<#list ["loop 2"] as x>
${x}
<#list ["loop 3"] as x>
${x}
</#list>
${x}
</#list>
${x}
</#list>
loop 2
loop 3
loop 2
loop 1 <#assign user = "Joe Hider">
${user} <#-- prints: Joe Hider -->
${.globals.user} <#-- prints: Big Joe -->
<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.
<br>Email: ${mail}</p>
</#macro>
<#assign mail = "jsmith@acme.com">
<#import "/lib/my_test.ftl" as my>
<#assign mail="fred@acme.com">
<@my.copyright date="1999-2002"/>
${my.mail}
${mail}
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
<br>Email: jsmith@acme.com</p>
jsmith@acme.com
fred@acme.com
<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="jsmith@other.com" in my>
${my.mail}
jsmith@other.com <#macro copyright date>
<p>Copyright (C) ${date} ${user}. All rights reserved.</p>
</#macro>
<#assign mail = "${user}@acme.com">
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="1999-2002"/>
${my.mail}
Fred@acme.com
参考:
FreeMarker in sourceforge.net
]]>
上面的例子中Q在单的HTML中加入了一些由${…}包围的特定FreeMarker的指令,q个文gq为模板了。而user、latestProduct.url和latestProduct.name来自于数据模型,由JavaE序提供Q模板设计者就不用兛_数据从哪来的?/P>
FreeMarker模板中可以包括下面四U特定部分:
一.) 文本Q直接输?BR>?) FTL标记(FreeMarker模板语言标记)Q类gHTML标记Q名字前?(有些以@开始,用户自定义标?予以区分Q不会输出?BR>字符?/STRONG>Q?使用单引h双引号限定;如果包含Ҏ字符需要{义符Q?{"It's \"quoted\" andthis is a backslash: \\"}
有一cȝD的字符?${r"C:\foo\bar"}Q输出结构ؓQC:\foo\barQ在引号前面加r被认为是U文本?
数字Q直接输入,不需要引受?{08}, ${+8}, ${8.00} and ${8} 都是相同?
布尔?/STRONG>Qtrue和falseQ不使用引号
Sequences(序列)Q由逗号分隔的变量列表,由方括号限定Q类似java中的一l数l:
输出l果Q?BR>winter
spring
summer
autumn
例二Q[2 + 2, [1, 2, 3, 4], "whatnot"]
例三Q?..5Q等同于[2, 3, 4, 5]Q?..2Q等同于[5,4,3,2]。注意方括号是不需要的?BR>
Hashes(散列)Q由逗号分隔的键-值列表,由大括号限定Q键和g间用冒号分隔Q{"name":"green mouse", "price":150}Q键和值都是表辑ּQ但是键必须是字W串?/P>
获取变量Q?{variable}Q变量名只能是字母、数字、下划线?、@?的组合,且不能以数字开头。下列表辑ּ是等LQ?BR>book.author.name
book["author"].name
book.author.["name"]
book["author"]["name"]
获取Sequence(序列)片断Q用[startindex..endindex]Q例如:seq中存储了"a", "b", "c", "d","e"Q那么seq[1..2]包含了b和c两个倹{?BR>
可以使用.variablename语法讉KFreeMarker内置变量?/P>
字符串操?/STRONG>
{"Hello ${user}!"} <==> ${"Hello " + user + "!"}
${"${user}${user}${user}${user}"} <==> ${user + user + user + user}
${…}只能在文本中使用Q下面是错误的代码:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if> //此处的代码也是错误的Q因为if指o需要的是booleanQ实际的却是个字W串
子字W串的操作,假设user的gؓ"Big Joe"Q?BR>${user[0]}${user[4]} <==> BJ
${user[1..4]} <==> ig J
Sequences(序列)操作
l果Q?BR>- Joe
- Fred
- Julia
- Kate
Hashes(散列)操作
l果Q?BR>- Joe is 30
- Fred is 25
- Julia is 18
术q算
l果Q?BR>-75
2.5
2
注意Q?操作W两边必L数字Q?+"Ӟ如果一Ҏ数字Q一Ҏ字符Ԍ׃自动数字{换ؓ字符丌Ӏ?BR>
使用内徏的指令int获得整数部分Q?/P>
l果Q?BR>2
1
1
-1
-1
比较操作W?/STRONG>Q?lt;#if expression>...</#if>
1.)使用=Q或==Q完全相{)试两个值是否相{,使用!= 试两个值是否不相等
2.)=?=两边必须是相同类型的|否则会生错误,例如<#if 1 = "1">会引起错?BR>3.)Freemarker是精比较,所?x"?x "?X"是不相等?BR>4.)Ҏ字和日期可以使用<?lt;=?gt;?gt;=Q但不能用于字符?BR>5.)׃Freemarker会将>解释成FTL标记的结束字W,所以对?gt;?gt;=可以使用括号来避免这U情况,例如<#if (x > y)>Q另一U替代的Ҏ是,使用lt、lte、gt和gte来替?lt;?lt;=?gt;?gt;=
逻辑操作W?/STRONG>Q?amp;&(and)、||(or)?(not)Q只能用于布|否则会生错?BR><#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>
内置函数Q用法类D问hash(散列)的子变量Q只是??"替代"."Q例如:user?upper_case
下面列出常用的一些函敎ͼ
对于字符?/U>
htmlQ对字符串进行HTML~码
cap_firstQ字符串第一个字母大?BR>lower_caseQ将字符串{换成写
trimQ去掉字W串前后的空白字W?BR>对于Sequences(序列)
sizeQ获得序列中元素的数?BR>对于数字
intQ取得数字的整数部分Q如-1.9?int的结果是-1Q?BR>
例一Q?/P>
<#-- test的gؓTom & Jerry -->
${test?html}
${test?upper_case?html}
l果Q?BR>Tom & Jerry
TOM & JERRY
例二Q?/P>
l果Q?BR>4
Spring
Horse
Ҏ的调?/STRONG>
${repeat("What", 3)}
${repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case}
l果Q?BR>WhatWhatWhat
xxxxxxWHATWHATWHATWHAT
操作W优先顺?/STRONG>
后缀 [subvarName] [subStringRange] . (methodParams)
一?nbsp; +expr?expr?
内徏 ?
乘法 *?/ ?
加法 +?
关系 <?gt;?lt;=?gt;=Qlt、lte、gt、gteQ?BR>相等 =?=
逻辑 &&
逻辑 ||
数字范围 ..
?) InterpolationQ由${...}?{...}两种cdQ输|可以定义输出的格?BR>例一Q?/P>
l果Q?BR>$42.00
$42.00
42
$42.00
4,200%
例二Q?/P>
l果Q?BR>2003-04-08 21:24:44 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 09:24:44 PM (PDT)
例三Q?/P>
l果Q?BR>yes
例四Q?/P>
说明QmXQ小数部分最X位;MXQ小数部分最大X位?/P>
?) 注释Q?lt;#--?->
下面是一个常用的模板例子Q?/P>
注意?/STRONG>Q?BR>1.) FreeMarker是区分大写的;
2.) FTL标记不能位于另一个FTL标记内部Q例如:<#if <#include 'foo'>='bar'>...</if>Q?BR>3.) ${…}只能在文本中使用Q?BR>4.) 多余的空白字W会在模板输出时去除Q?BR>5.) 如果使用的指令不存在Q会产生一个错误消息?/P>
参考:
FreeMarker in sourceforge.net
]]>