分享
 
 
 

FreeMarker设计指南(4) (完)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

FreeMarker设计指南(4) (完)

4、杂项

(1)用户定义指令

l 宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏

l 基本用法

Ø 宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:

<#macro greet>

<font size="+2">Hello Joe!</font>

</#macro>

Ø 作为用户定义指令使用宏变量时,使用@替代FTL标记中的#

<@greet></@greet>

Ø 如果没有体内容,也可以使用:

<@greet/>

l 参数

Ø 在macro指令中可以在宏变量之后定义参数,如:

<#macro greet person>

<font size="+2">Hello ${person}!</font>

</#macro>

Ø 可以这样使用这个宏变量:

<@greet person="Fred"/> and <@greet person="Batman"/>

输出结果是:

<font size="+2">Hello Fred!</font>

and <font size="+2">Hello Batman!</font>

Ø 宏的参数是FTL表达式,所以下面的代码具有不同的意思:

<@greet person=Fred/>

Ø 这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式

Ø 宏可以有多参数,下面是一个例子:

<#macro greet person color>

<font size="+2" color="${color}">Hello ${person}!</font>

</#macro>

Ø 可以这样使用该宏变量:

<@greet person="Fred" color="black"/>

Ø 其中参数的次序是无关的,因此下面是等价的:

<@greet color="black" person="Fred"/>

Ø 只能使用在macro指令中定义的参数,并且对所有参数赋值,所以下面的代码是错误的:

<@greet person="Fred" color="black" background="green"/>

<@greet person="Fred"/>

Ø 可以在定义参数时指定缺省值,如:

<#macro greet person color="black">

<font size="+2" color="${color}">Hello ${person}!</font>

</#macro>

Ø 这样<@greet person="Fred"/>就正确了

Ø 宏的参数是局部变量,只能在宏定义中有效

l 嵌套内容

Ø 用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断

Ø 例子:

<#macro border>

<table border=4 cellspacing=0 cellpadding=4><tr><td>

<#nested>

</tr></td></table>

</#macro>

这样使用该宏变量:

<@border>The bordered text</@border>

输出结果:

<table border=4 cellspacing=0 cellpadding=4><tr><td>

The bordered text

</tr></td></table>

Ø <#nested>指令可以被多次调用,例如:

<#macro do_thrice>

<#nested>

<#nested>

<#nested>

</#macro>

<@do_thrice>

Anything.

</@do_thrice>

输出结果:

Anything.

Anything.

Anything.

Ø 嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:

<@border>

<ul>

<@do_thrice>

<li><@greet person="Joe"/>

</@do_thrice>

</ul>

</@border>

输出结果:

<table border=4 cellspacing=0 cellpadding=4><tr><td>

<ul>

<li><font size="+2">Hello Joe!</font>

<li><font size="+2">Hello Joe!</font>

<li><font size="+2">Hello Joe!</font>

</ul>

</tr></td></table>

Ø 宏定义中的局部变量对嵌套内容是不可见的,例如:

<#macro repeat count>

<#local y = "test">

<#list 1..count as x>

${y} ${count}/${x}: <#nested>

</#list>

</#macro>

<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>

输出结果:

test 3/1: ? ? ?

test 3/2: ? ? ?

test 3/3: ? ? ?

Ø

l 在宏定义中使用循环变量

Ø 用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字

Ø 例子:

<#macro repeat count>

<#list 1..count as x>

<#nested x, x/2, x==count>

</#list>

</#macro>

<@repeat count=4 ; c, halfc, last>

${c}. ${halfc}<#if last> Last!</#if>

</@repeat>

输出结果:

1. 0.5

2. 1

3. 1.5

4. 2 Last!

Ø 指定的循环变量的数目和用户定义指令开始标记指定的不同不会有问题

n 调用时少指定循环变量,则多指定的值不可见

n 调用时多指定循环变量,多余的循环变量不会被创建

(2)在模板中定义变量

l 在模板中定义的变量有三种类型:

Ø plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换

Ø 局部变量:在宏定义体中有效,使用local指令创建和替换

Ø 循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量

l 局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子:

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

输出结果:

1. plain

2. plain

3. local

4. loop

5. local

6. plain

7. loop

8. loop

9. plain2

l 内部循环变量隐藏同名的外部循环变量,如:

<#list ["loop 1"] as x>

${x}

<#list ["loop 2"] as x>

${x}

<#list ["loop 3"] as x>

${x}

</#list>

${x}

</#list>

${x}

</#list>

输出结果:

loop 1

loop 2

loop 3

loop 2

loop 1

l 模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe:

<#assign user = "Joe Hider">

${user} <#-- prints: Joe Hider -->

${.globals.user} <#-- prints: Big Joe -->

(3)名字空间

l 通常情况,只使用一个名字空间,称为主名字空间

l 为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突

l 创建库

Ø 下面是一个创建库的例子(假设保存在lib/my_test.ftl中):

<#macro copyright date>

<p>Copyright (C) ${date} Julia Smith. All rights reserved.

<br>Email: ${mail}</p>

</#macro>

<#assign mail = "jsmith@acme.com">

Ø 使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量:

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

可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间

l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子:

<#import "/lib/my_test.ftl" as my>

${my.mail}

<#assign mail="jsmith@other.com" in my>

${my.mail}

l 输出结果:

jsmith@acme.com

jsmith@other.com

l 数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库:

<#macro copyright date>

<p>Copyright (C) ${date} ${user}. All rights reserved.</p>

</#macro>

<#assign mail = "${user}@acme.com">

l 假设数据模型中的user变量的值是Fred,则下面的代码:

<#import "/lib/my_test.ftl" as my>

<@my.copyright date="1999-2002"/>

${my.mail}

l 输出结果:

<p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>

Fred@acme.com

[点击此处收藏本文]

发表于 2004年11月17日 10:14 PM

--

flylyke 发表于2004-11-19 12:48 AM

老兄,翻译的好

yny 发表于2004-12-22 12:15 PM

老兄,翻译的好

steven 发表于2005-02-24 8:40 PM

这几天我也在看Freemaker,我想请问一个问题,

freemarker.template 下的 addMacro() 和addImport() 两个方法是干什么的,怎么用,我看了半天,谢谢了

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有