??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. sequence?first q回sequence的第一个倹{?/span>
2. sequence?last q回sequence的最后一个倹{?/span>
3. sequence?reverse sequence的现有顺序反转,卛_序排序
4. sequence?size q回sequence的大?/span>
5. sequence?sort sequence中的对象转化为字W串后顺序排?/span>
6. sequence?sort_by(value) 按sequence中对象的属性valueq行排序
注意QSequence不能为null。以上方法在我的另一博客Freemarker中如何遍历List有详l的应用Q感兴趣的朋友可以参考?/span>
二?span style="font: 7pt 'Times New Roman'"> Hash的内|函?/span>
1. hash?keys q回hash里的所有key,q回l果为sequence
2. hash?values q回hash里的所有value,q回l果为sequence
例如Q?/span>
<#assign user={“name”:“hailang”, “sex”:“man”}>
<#assign keys=user?keys>
<#list keys as key>
${key}=${user[key]}
</#list>
三?span style="font: 7pt 'Times New Roman'"> 操作字符串函?/span>
1. substringQstart,endQ从一个字W串中截取子?/span>
start:截取子串开始的索引Qstart必须大于{于0Q小于等于end
end: 截取子串的长度,end必须大于{于0Q小于等于字W串长度Q如果省略该参数Q默认ؓ(f)字符串长度?/span>
例子Q?/span>
${‘str’?substring(0)}àl果为str
${‘str’?substring(1)}àl果为tr
${‘str’?substring(2)}àl果为r
${‘str’?substring(3)}àl果?/span>
${‘str’?substring(0,0)}àl果?/span>
${‘str’?substring(0,1)}àl果为s
${‘str’?substring(0,2)}àl果为st
${‘str’?substring(0,3)}àl果为str
2. cap_first 字W串中的W一个单词的首字母变为大写?/span>
${‘str’Qcap_first}àl果为Str
3. uncap_first字W串中的W一个单词的首字母变为小写?/span>
${‘Str’Qcap_first}àl果为str
4. capitalize字W串中的所有单词的首字母变为大?/span>
${‘str’Q?capitalize}àl果为STR
5. date,timeQdatetime字W串转换为日?/span>
例如Q?/span>
<#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)>
<#assign date2=”9:28:20”?time(“HH:mm:ss”)>
<#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)>
${date1}àl果?009-10-12
${date2}àl果?:28:20
${date3}àl果?009-10-12 9:28:20
注意Q如果指定的字符串格式不正确引发错误?/span>
6. ends_with 判断某个字符串是否由某个子串l尾Q返回布?yu)(dng)倹{?/span>
${“string”?ends_with(“ing”)?string} q回l果为true
注意Q布?yu)(dng)值必{换ؓ(f)字符串才能输?/span>
7. html 用于字W串中的<?gt;?amp;?#8220;替换为对应得<>":&
8. index_ofQsubstring,startQ在字符串中查找某个子串Q返回找到子串的W一个字W的索引Q如果没有找到子Ԍ则返?1?/span>
Start参数用于指定从字W串的那个烦(ch)引处开始搜索,start为数字倹{?/span>
如果start大于字符串长度,则start取值等于字W串长度Q如果start于0Q?则start取gؓ(f)0?/span>
${“string”?index_of(“in”) àl果?
${“string”?index_of(“ab”) àl果?1
9. lengthq回字符串的长度 ${“string”?length}àl果?
10. lower_case字W串转ؓ(f)写
${“STRING”?lower_case}àl果为string
11. upper_case字W串转ؓ(f)大写
${“string”?upper_case}àl果为STRING
12. contains 判断字符中是否包含某个子丌Ӏ返回布?yu)(dng)?/span>
${“string”?contains(“ing”)?string} àl果为true
注意Q布?yu)(dng)值必{换ؓ(f)字符串才能输?/span>
13. number字W串转换为数?/span>
${“111.11”?number}àl果?11.11
14. replace用于字W串中的一部分从左到右替换为另外的字符丌Ӏ?/span>
${“strabg”?replace(“ab”,”in”)} àl果为string
15. split使用指定的分隔符一个字W串拆分Zl字W串
<#list “This|is|split”?split(“|”) as s>
${s}
</#list>
l果?
This
is
split
16. trim 删除字符串首?${“ String ”?trim} àl果为String
四?span style="font: 7pt 'Times New Roman'"> 操作数字
1. c 用于数字{换ؓ(f)字符?/span>
${123?c} àl果?23
2. string用于数字{换ؓ(f)字符?/span>
Freemarker中预订义?jin)三U数字格式:(x)number,currencyQ货币)(j)和percent(癑ֈ?其中number为默认的数字格式转换
例如Q?nbsp;
<#assign tempNum=20>
${tempNum}
${tempNum?string.number}?{tempNum?string(“number”)} àl果?0
${tempNum?string.currency}?{tempNum?string(“currency”)} àl果为E20.00
${tempNum?string. percent}?{tempNum?string(“percent”)} àl果?,000%
五?span style="font: 7pt 'Times New Roman'"> 操作布尔?/span>
string 用于布?yu)(dng)D{换ؓ(f)字符串输?/span>
true转ؓ(f)“true”Qfalse转换?#8220;false”
foo?string(“yes”,”no”)如果布尔值是true,那么q回“yes”,否则q回no
通过上面对开发中常用的Freemarker内置函数?qing)用法的介绍Q相信?zhn)已经对这些函数的有?jin)一定的?jin)解Q希望本文能Ҏ(gu)的开发有所帮助。由于时间仓?j),有不之处请?zhn)批评指正?/span>
除此之外,集合元素也可以是表达?例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
q可以用数字范围定义数字集??..5{同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用Ҏ(gu)?数字范围也支持反递增的数字范??..2
Map对象
Map对象使用花括号包?Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例?
{"语文":78, "数学":80}
Map对象的key和value都是表达?但是key必须是字W串
输出变量?/span>
FreeMarker的表辑ּ输出变量?q些变量可以是顶层变?也可以是Map对象中的变量,q可以是集合中的变量,q可以用点(.)语法来访问Java对象的属?下面分别讨论q些情况
1,层变量
所谓顶层变量就是直接放在数据模型中的?例如有如下数据模?
Map root = new HashMap(); //创徏数据模型
root.put("name","annlee"); //name是一个顶层变?/p>
对于层变量,直接使用${variableName}来输出变量?变量名只能是字母,数字,下划U?$,@?的组?且不能以数字开头号.Z(jin)输出上面的name的?可以使用如下语法:
${name}
2,输出集合元素
如果需要输出集合元?则可以根据集合元素的索引来输出集合元?集合元素的烦(ch)引以Ҏ(gu)h?假设有烦(ch)?
["星期一","星期?,"星期?,"星期?,"星期?,"星期?,"星期?].该烦(ch)引名为week,如果需要输出星期三,则可以用如下语?
${week[2]} //输出W三个集合元?/p>
此外,FreeMarkerq支持返回集合的子集?如果需要返回集合的子集?则可以用如下语?
week[3..5] //q回week集合的子集合,子集合中的元素是week集合中的W?-6个元?/p>
3,输出Map元素
q里的Map对象可以是直接HashMap的实?甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性ؓ(f)key,属性gؓ(f)value的Map实例.Z(jin)输出Map元素的?可以使用点语法或Ҏ(gu)可?假如有下面的数据模型:
Map root = new HashMap();
Book book = new Book();
Author author = new Author();
author.setName("annlee");
author.setAddress("gz");
book.setName("struts2");
book.setAuthor(author);
root.put("info","struts");
root.put("book", book);
Z(jin)讉K数据模型中名为struts2的书的作者的名字,可以使用如下语法:
book.author.name //全部使用点语?br />
book["author"].name
book.author["name"] //混合使用点语法和Ҏ(gu)可?br />
book["author"]["name"] //全部使用Ҏ(gu)可?/p>
使用点语法时,变量名字有顶层变量一L(fng)限制,但方括号语法没有该限?因ؓ(f)名字可以是Q意表辑ּ的结?
集合q接q算W?
q里所说的集合q算W是两个集合连接成一个新的集?q接集合的运符?,看如下的例子:
<#list ["星期一","星期?,"星期?] + ["星期?,"星期?,"星期?,"星期?] as x>
${x}
</#list>
输出l果?星期一 星期?星期?星期?星期?星期?星期?/p>
Mapq接q算W?/span>
Map对象的连接运符也是两个Map对象q接成一个新的Map对象,Map对象的连接运符?,如果两个Map对象h相同的key,则右边的值替代左边的?看如下的例子:
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
语文成W?{scores.语文}
数学成W?{scores.数学}
Java成W?{scores.Java}
输出l果?
语文成W?6
数学成W?7
Java成W?3
Q?在web.xml文g中配|freemark同时启动JSPSupportServlet.代码如下Q?/p>
Q?在FreeMarker模板中用assign指o(h)导入标签库。代码如?/p>
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:(x)q里我把struts-tags.tld攑֜WEB-INF下面
4.现在我们可以在FreeMarker模板中用标{了(jin)
CZ代码如下Q?/p>
模板设计者不兛_(j)数据从那儿来Q只知道使用已经建立的数据模型?
数据模型q序员~程来创建,向模板提供变化的信息Q这些信息来自于数据库、文Ӟ甚至于在E序中直接生成?
数据cdQ?
一、基本:(x)
1、scalarsQ存储单?
字符Ԍ(x)单文本由单或双引hh?
数字Q直接用数倹{?
日期Q通常从数据模型获?
布尔|(x)true或falseQ通常?lt;#if …>标记中?
2、hashesQ充当其它对象的容器Q每个都兌一个唯一的查询名?
h一个唯一的查询名字和他包含的每个变量相关联?
3、sequencesQ充当其它对象的容器Q按ơ序讉K
使用数字和他包含的每个变量相兌。烦(ch)引g0开始?
4、集合变量:(x)
除了(jin)无法讉K它的大小和不能用烦(ch)引来获得它的子变量:(x)集合可以看作只能?lt;#list...>指o(h)使用的受限sequences?
5、方法:(x)通过传递的参数q行计算Q以新对象返回结?
Ҏ(gu)变量通常是基于给出的参数计算值在数据模型中定义?
6、用戯定义FTL指o(h)Q宏和变换器
7、节?
节点变量表示为树(wi)型结构中的一个节点,通常在XML处理中用?
模板Q?
使用FTLQfreeMarker模板语言Q编?
l成部分
一、整体结?
1、注释:(x)<#--注释内容-->Q不?x)输出?
2、文本:(x)直接输出?
3、interpolation:?${var} ?#{var} 限定Q由计算g替输出?
4、FTL标记
二、指令:(x)
freemarker指o(h)有两U:(x)
1、预定义指o(h)Q引用方式ؓ(f)<#指o(h)名称>
2、用户定义指令:(x)引用方式?lt;@指o(h)名称>Q?span style="background-color: #00ff00">引用用户定义指o(h)旉?换ؓ(f)@?/span>
注意Q如果用不存在的指令,FreeMarker不会(x)使用模板输出Q而是产生一个错误消息?
freemarker指o(h)由FTL标记来引用,FTL标记和HTML标记cMQ名字前?来加以区分。如HTML标记的Ş式ؓ(f)<h1></h1>则FTL标记的Ş式是<#list></#list>Q此处h1标记和list指o(h)没有M功能上的对应关系Q只是做明用一下)(j)?
有三UFTL标记Q?
1)、开始标讎ͼ(x)<#指o(h)名称>
2)、结束标讎ͼ(x)</#指o(h)名称>
3)、空标记Q?lt;#指o(h)名称/>
注意Q?
1) FTL?x)忽略标C中的I格Q但是,<#和指??</#和指?之间不能有空根{?
2) FTL标记不能够交叉,必须合理嵌套。每个开始标记对应一个结束标讎ͼ层层嵌套?如:(x)
<#list>
<li>
${数据}
<#if 变量>
<p>game over!</p>
</#if>
</li>
</#list>
注意事项Q?
1)?span style="background-color: #00ff00">FTL对大写敏感?/span>所以用的标记?qing)interpolation要注意大写。name与NAME是不同的对象?lt;#list>是正的标记Q?lt;#List>则不是?
2)、interpolation只能在文本部分用,不能位于FTL标记内。如<#if ${var}>是错误的Q正的Ҏ(gu)是:(x)<#if var>,而且此处var必须为布?yu)(dng)倹{?
3)、FTL标记不能位于另一个FTL标记内部Q注释例外。注释可以位于标记及(qing)interpolation内部?
三、表辑ּ
1、直接指定|(x)
1-1、字W串Q?
由双引号或单引号括v来的字符Ԍ其中的特D字W(? " \{)(j)需要{义?
1-2?span style="background-color: #00ff00">raw字符Ԍ(x)
有一U特D的字符串称为raw字符Ԍ被认为是U文本,其中的\和{{不hҎ(gu)含义Q该cdW串在引号前面加rQ下面是一个例子:(x)
${r"/${da
转义 含义
序列
\" 双引?u0022)
\' 单引?u0027)
\\ 反斜?u005C)
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
\{ {
\xCode 4?6q制Unicode代码
1-3、数字:(x)直接输入Q不需要引?
1)、精度数字?#8220;.”分隔Q不能用分l符?
2)、目前版本不支持U学计数法,所?#8220;1E3”是错误的
3)、不能省略小数点前面?Q所?#8220;.5”是错误的
4)、数??8?8?.00都是相同?
1-4、布?yu)(dng)|(x)true和falseQ不使用引号
1-5?span style="background-color: #00ff00">序列Q由逗号分隔的子变量列表Q由[]Ҏ(gu)号限定?/span>
1)、子变量列表可以是表辑ּ
2)、可以用数字范围定义数字序列,<b>不需要方括号限定</b>Q例?..5{同于[2, 3, 4, 5]Q但是更有效率,可以定义反递增范围如:(x)5..2?
1-6?span style="background-color: #00ff00">散列(hash)
1)?span style="background-color: #00ff00">由逗号分隔的键/值列表,由{}大括号限定,键和g间用冒号分隔Q如Q{"key1":valu1,"key2":"character string"....}
2)?span style="background-color: #00ff00">键和值都是表辑ּQ但是键必须是字W串?/span>
2、获取变量:(x)
2-1、顶层变量:(x)${变量名}
变量名只能是字母、数字、下划线??、@ 的组合,且不能以数字开头?
2-2?span style="background-color: #00ff00">散列Q有两种Ҏ(gu)
1)?span style="background-color: #00ff00">点语法:(x)变量名字和顶层变量的名字受同L(fng)限制
2)?span style="background-color: #00ff00">Ҏ(gu)可法:(x)变量名字无限Ӟ可以是Q意的表达式的l果
book.author.name 散列表的多Q{"book":{"author":{"name":"张三"},"price":{"price1":200,"price2":500}},"book":{"author":{"name":"张三"}}
book.author.["name"]
book["author"].name
book["author"]["name"]
以上是等L(fng)?
2-3、序列:(x)使用散列的方括号语法获取变量Q方括号中的表达式结果必Mؓ(f)数字。注意:(x)W一个项目的索引?。可以?
[startindex..endindex]语法获取序列片段?
2-4、特D变量:(x)FreeMarker内定义变量,使用.variablename语法讉K?
3、字W串操作
3-1、interpolation:使用${}?{}在文本部分插入表辑ּ的|例如Q?
${"hello${username}!"}
${"${username}${username}${username}"}
也可以?来获得同L(fng)l果Q?
${"hello"+username+"!"}
${username+username+username}
注意Q?{}只能用于文本部分而不能出C标记内?
<#if ${user.login}>?lt;#if "${user.login}">都是错误?
<#if user.login>是正的?
本例中user.login的值必L布尔cd?
3-2、子Ԍ(x)
举例说明Q假如user的gؓ(f)"Big Joe"
${user[0]}${user[4]}l果是:(x)BJ
${user[1..4]}l果是:(x)ig J
4、序列操?
4-1、连接操作:(x)可以使用+来操作,例如Q?
["title","author"]+["month","day"]
5、散列操?
5-1、连接操作:(x)可以使用+来操作,如果有相同的KEYQ则双的g(x)替代左边的|例如Q?
{"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}l果month的值就??
6、算术运?
6-1、操作符Q?????
?号以外的其他操作W两边的数据Q必都是数字类型?
如果+h作符一Ҏ(gu)一个字W型数据Q会(x)自动另一边的数据转换为字W型数据Q运结果ؓ(f)字符型数据?
6-2、比较操作符Q?
1)?
2)?=
3)?=
4)?lt;
5)?lt;=
6)?gt;
7)?gt;=
1-3的操作符Q两边的数据cd必须相同Q否则会(x)产生错误
4-7的操作符Q对于日期和数字可以使用Q字W串不可以用?
注意Q?
1)?span style="background-color: #00ff00">FreeMarker是精比较,所?x" "x " "X"是不{的?
2)、因?lt;?gt;对FTL来说是开始和l束标记Q所以,可以用两U方法来避免q种情况Q?
一U是使用括号<#if (a<b)>
另一是用替代输出,对应如下Q?
< lt
<= lte
> gt
>= gte
6-3、逻辑操作W:(x)只能用于布尔|否则?x)出现错误?
&&(and)与运?
||(or)或运?
!(not)非运?
6-4、内建函?/span>Q用方法类g讉K散列的子变量Q只是?代替.例如Q?{test?upper_case?html}
常用的内建函数列丑֦下:(x)
1)、字W串使用Q?
html:对字W串q行HTML~码
cap_first:字符串第一个字母大?
lower_first:字符串第一个字母小?
upper_case:字W串转换成大?
trim:d字符前后的空白字W?/span>
2)、序列用:(x)
size:获得序列中元素的数目
3)、数字用:(x)
int:取得数字的整数部?/span>
7、操作符的优先顺序:(x)
后缀Q[subbarName][subStringRange].(mathodParams)
一元:(x)+expr?expr? (not)
内徏Q?
乘法Q???
加法Q??
关系Q?lt;?lt;=?gt;?gt;= (lt、lte、gt、gte)
相等Q??=?=
逻辑与:(x)&& (and)
逻辑或:(x)|| (or)
数字范围Q?.
四、interpolation
inperpolation只能用于文本Q有两种cdQ通用interpolation?qing)数字interpolation
1、通用interpolation
?{expr}
1-1、插入字W串|(x)直接输出表达式结果?
1-2、插入数字|(x)Ҏ(gu)~省格式(由setting指o(h)讄)表辑ּl果转换成文本输?可以使用内徏函数string来格式化单个interpolation
如:(x)
<#setting number_format="currency" />
<#assign answer=42 />
${answer} <#-- K?2.00 -->
${answer?string} <#-- K?2.00 -->
${answer?string.number} <#-- 42 -->
${answer?string.currency} <#-- K?2.00 -->
${answer?string.percent} <#-- 42,00Q?-->
1-3、插入日期|(x)Ҏ(gu)~省格式(由setting指o(h)讄)表辑ּl果转换成文本输?可以使用内徏函数string来格式化单个interpolation
如:(x)
${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")} <#-- 2003-04-08 21:24:44 Pacific Daylight Time -->
${lastupdata?string("EEE,MMM d, ''yy")} <#-- tue,Apr 8, '03 -->
${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")} <#-- Tuesday,April 08, 2003, 09:24:44 PM (PDT)-->
1-4、插入布?yu)(dng)|(x)Ҏ(gu)~省格式(由setting指o(h)讄)表辑ּl果转换成文本输?可以使用内徏函数string来格式化单个interpolation
如:(x)
<#assign foo=ture />
${foo?string("yes","no")} <#-- yes -->
2、数字interpolation:
有两UŞ式:(x)
1)?{expr}
2)?{expr;format}Qformat可以用来格式化数字,format可以是如下:(x)
mX:数部分最X?
MX:数部分最大X?
例如Q?
<#assign x=2.582 />
<#assign y=4 />
#{x;M2} <#-- 2.58 -->
#{y;M2} <#-- 4 -->
#{x;m1} <#-- 2.582 -->
#{y;m1} <#-- 4.0 -->
#{x;m1M2} <#-- 2.58 -->
#{y;m1M2} <#-- 4.0 -->
杂项
一?span style="background-color: #00ff00">用户定义指o(h)
?/span>?span style="background-color: #00ff00">变换器变?/span>是两U不同类型的用户自定义指令,他们的区别是Q?
宏可以在模板中用macro指o(h)来定?
变换器是在模板外q序定?
1、宏Q和某个变量兌的模板片D,以便在模板中通过用户自定义指令用该变量
1-1、基本用法:(x)
例如Q?
<#macro greet>
<font size="+2"> Hello JOE!</font>
</#macro>
使用Ӟ(x)
<@greet></@greet>
如果没有体内容也可以?
<@greet />
1-2、变量:(x)
1)、可以在宏定义之后定义参敎ͼ宏参数是局部变量,只在宏定义中有效。如Q?
<#macro greet person>
<font size="+2"> Hello ${person}!</font>
</#macro>
使用Ӟ(x)
<@greet person="emma"> and <@greet person="LEO">
输出为:(x)
<font size="+2"> Hello emma!</font>
<font size="+2"> Hello LEO!</font>
注意Q宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义Q这意味着变量emma的glperson,q个值可能是L一U数据类型,甚至是一个复杂的表达式?
宏可以有多个参数Q用时参数的次序是无关的,但是只能使用宏中定义的参敎ͼq且Ҏ(gu)有参数赋倹{如Q?
<#macro greet person color>
<font size="+2" color="${color}"> Hello ${person}!</font>
</#macro>
使用Ӟ(x)
<@greet color="black" person="emma" />正确
<@greet person="emma" />错误Qcolor没有赋|此时Q如果在定义宏时为color定义~省?lt;#macro greet person color="black">q样的话Q这个用方法就是正的?
<@greet color="black" person="emma" bgcolor="yellow" />错误Q宏greet定义中未指定bgcolorq个参数
2、嵌套内容:(x)
2-1、自定义指o(h)可以有嵌套内容,使用<#nested>指o(h)Q执行自定义指o(h)开始和l束标记之间的模板片Dc(din)例如:(x)
<#macro greet>
<p>
<#nested>
</p>
</#macro>
<@greet>hello Emma!</@greet>
输出?
<p>hello Emma!</p>
2-2?lt;#nested>指o(h)可以被多ơ调用,例如
<#macro greet>
<p>
<#nested>
<#nested>
<#nested>
<#nested>
</p>
</#macro>
<@greet>hello Emma!</@greet>
输出?
<p>
hello Emma!
hello Emma!
hello Emma!
hello Emma!
</p>
2-3、嵌套的内容可以是有效的FTLQ例如:(x)
<#macro welcome>
<p>
<#nested>
</p>
</#macro>
<#macro greet person color="black">
<font size="+2" color="${color}"> Hello ${person}!</font>
</#macro>
<@welcome>
<@greet person="Emma" color="red" />
<@greet person="Andrew" />
<@greet person="Peter" />
</@welcome>
输出为:(x)
<p>
<font size="+2" color="red"> Hello Emma!</font>
<font size="+2" color="black"> Hello Andrew!</font>
<font size="+2" color="black"> Hello Peter!</font>
</p>
2-4、宏定义中的局部变量对嵌套内容是不可见的,例如Q?
<#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>
输出l果?
test 3/1:???
test 3/2:???
test 3/3:???
2-5、在宏定义中使用循环变量Q通常用来重复嵌套内容Q基本用法ؓ(f)Q作为nested指o(h)的参敎ͼ传递@环变量的实际|而在调用自定义指令时Q在标记的参数后面指定@环变量的名字?
例如Q?
<#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>
输出l果?
1. 0.5
2. 1
3. 1.5
4. 2last!
注意Q指定@环变量的数目和用户定义指令开始标记指定的不同不会(x)有问?
调用Ӟ指定@环变量,多指定的g(x)不见
调用Ӟ多指定@环变量,多余的@环变量不?x)被创?
二、在模板中定义变?
1、在模板中定义的变量有三U类?
1-1、plain变量Q可以在模板的Q何地方访问,包括使用include指o(h)插入的模板,使用assign指o(h)创徏和替换?
1-2、局部变量:(x)在宏定义体中有效Q用local指o(h)创徏和替换?
1-3、@环变量:(x)只能存在于指令的嵌套内容Q由指o(h)(如list)自动创徏?
注意Q?
1)、宏的参数是局部变量,不是循环变量?
2)、局部变量隐藏同名的plain变量
3)、@环变量隐藏同名的plain变量和局部变量?
例如Q?
<#assign x="plain">
1. ${x} <#-- plain -->
<@test />
6. ${x}
<#list ["loop"] as x>
7. ${x} <#-- loop -->
<#assign x="plain2">
8. ${x} <#-- loop -->
</#list>
9. ${x} <#-- plain2 -->
<#macro test>
2. ${x} <#-- plain -->
<#local x="local">
3. ${x} <#-- local -->
<#list ["loop"] as x>
4. ${x} <#-- loop -->
</#list>
5. ${x} <#-- local -->
</#macro>
4)、内部@环变量隐藏同名的外部循环变量
<#list ["loop1"] as x>
${x} <#-- loop1 -->
<#list ["loop2"] as x>
${x} <#-- loop2 -->
<#list ["loop3"] as x>
${x} <#-- loop3 -->
</#list>
${x} <#-- loop2 -->
</#list>
${x} <#-- loop1 -->
</#list>
5)、模板中的变量会(x)隐藏数据模型中的同名变量Q如果需讉K数据模型中的变量Q用特D变量global?
例如Q?
假设数据模型中的usergؓ(f)Emma
<#assign user="Man">
${user} <#-- Man -->
${.global.user} <#-- Emma -->