您的位置:首页 > 其它

FreeMarker设计指南(4)

2013-08-28 19:10 211 查看
操作符优先顺序
操作符组
操作符
后缀
[subvarName][subStringRange].(methodParams)
一元
+expr、-expr、!
内建
?
乘法
*、/、%
加法
+、-
关系
<、>、<=、>=(lt、lte、gt、gte)
相等
==(=)、!=
逻辑and
&&
逻辑or
||
数字范围
..
4Interpolation
lInterpolation有两种类型:
Ø通用Interpolation:${expr}
Ø数字Interpolation:#{expr}或#{expr;format}
l注意:Interpolation只能用于文本部分
l通用Interpolation
Ø插入字符串值:直接输出表达式结果
Ø插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个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%

Ø插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个使用格式模式的例子:
${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)

Ø插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子:
<#assignfoo=true/>
${foo?string("yes","no")}

输出结果是:
yes

l数字Interpolation的#{expr;format}形式可以用来格式化数字,format可以是:
ØmX:小数部分最小X位
ØMX:小数部分最大X位
Ø例子:
<#--IfthelanguageisUSEnglishtheoutputis:-->
<#assignx=2.582/>
<#assigny=4/>
#{x;M2}<#--2.58-->
#{y;M2}<#--4-->
#{x;m1}<#--2.6-->
#{y;m1}<#--4.0-->
#{x;m1M2}<#--2.58-->
#{y;m1M2}<#--4.0-->


4、杂项
1)用户定义指令
l宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏
l基本用法
Ø宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:
<#macrogreet>
<fontsize="+2">HelloJoe!</font>
</#macro>

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

Ø如果没有体内容,也可以使用:
<@greet/>

l参数
Ø在macro指令中可以在宏变量之后定义参数,如:
<#macrogreetperson>
<fontsize="+2">Hello${person}!</font>
</#macro>

Ø可以这样使用这个宏变量:
<@greetperson="Fred"/>and<@greetperson="Batman"/>

输出结果是:
<fontsize="+2">HelloFred!</font>
and<fontsize="+2">HelloBatman!</font>

Ø宏的参数是FTL表达式,所以下面的代码具有不同的意思:
<@greetperson=Fred/>

Ø这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式
Ø宏可以有多参数,下面是一个例子:
<#macrogreetpersoncolor>
<fontsize="+2"color="${color}">Hello${person}!</font>
</#macro>

Ø可以这样使用该宏变量:
<@greetperson="Fred"color="black"/>

Ø其中参数的次序是无关的,因此下面是等价的:
<@greetcolor="black"person="Fred"/>

Ø只能使用在macro指令中定义的参数,并且对所有参数赋值,所以下面的代码是错误的:
<@greetperson="Fred"color="black"background="green"/>
<@greetperson="Fred"/>

Ø可以在定义参数时指定缺省值,如:
<#macrogreetpersoncolor="black">
<fontsize="+2"color="${color}">Hello${person}!</font>
</#macro>

Ø这样<@greetperson="Fred"/>就正确了
Ø宏的参数是局部变量,只能在宏定义中有效
l嵌套内容
Ø用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断
Ø例子:
<#macroborder>
<tableborder=4cellspacing=0cellpadding=4><tr><td>
<#nested>
</tr></td></table>
</#macro>

这样使用该宏变量:
<@border>Theborderedtext</@border>

输出结果:
<tableborder=4cellspacing=0cellpadding=4><tr><td>
Theborderedtext
</tr></td></table>

Ø<#nested>指令可以被多次调用,例如:
<#macrodo_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
</@do_thrice>

输出结果:
Anything.
Anything.
Anything.

Ø嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:
<@border>
<ul>
<@do_thrice>
<li><@greetperson="Joe"/>
</@do_thrice>
</ul>
</@border>

输出结果:
<tableborder=4cellspacing=0cellpadding=4><tr><td>
<ul>
<li><fontsize="+2">HelloJoe!</font>
<li><fontsize="+2">HelloJoe!</font>
<li><fontsize="+2">HelloJoe!</font>
</ul>
</tr></td></table>

Ø宏定义中的局部变量对嵌套内容是不可见的,例如:
<#macrorepeatcount>
<#localy="test">
<#list1..countasx>
${y}${count}/${x}:<#nested>
</#list>
</#macro>
<@repeatcount=3>${y?default("?")}${x?default("?")}${count?default("?")}</@repeat>

输出结果:
test3/1:???
test3/2:???
test3/3:???

Ø
l在宏定义中使用循环变量
Ø用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字
Ø例子:
<#macrorepeatcount>
<#list1..countasx>
<#nestedx,x/2,x==count>
</#list>
</#macro>
<@repeatcount=4;c,halfc,last>
${c}.${halfc}<#iflast>Last!</#if>
</@repeat>

输出结果:
1.0.5
2.1
3.1.5
4.2Last!

Ø指定的循环变量的数目和用户定义指令开始标记指定的不同不会有问题
n调用时少指定循环变量,则多指定的值不可见
n调用时多指定循环变量,多余的循环变量不会被创建

阅读(608)|评论(0)|转发(0)|

0
上一篇:FreeMarker设计指南(3)

下一篇:FreeMarker设计指南(5)

相关热门文章

类的设计原则:单一职责SPR、...

常青iTop运维管理门户实施讲座...

常青IT资产管理套件公测产管理...

 某集团IT资产管理典型案例分...

常青OwnCloud云存储网盘讲座(...

JDK1.6官方下载_JDK6官方下载_...

MyEclipse6.5下载及注册码...

Eclipse+MyEclipse的配置

Eclipse插件安装、升级和卸载...

最新版SWTDesigner6.0安装,...

php集成环境和自己配置的区别...

flash播放控件

查看nginx某一时段的日志...

ftp服务器日志分析

mpi目标机器积极拒绝,下面错...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: