表达式是FreeMarker模板的核心功能,表达式放置在插值语法(${……})之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker标签结合,用于控制输出。
[color=blue][b]直接指定值[/b][/color]
使用直接指定值的语法让FreeMarker直接输出插值中的值,而不是输出变量值。直接指定值可以是字符串、数值、布尔值、集合和MAP对象。
如果字符串中包含特殊字符,需要转义。
${"文件保存在c:\\盘"} --输出为-- 文件保存在c:\盘
${'名字是\"Hoffman\"'} --输出为-- 名字是"Hoffman
注意:Map对象的key和value都是表达式,但是key必须是字符串
{"语文":85, "数学":83, "程序":99}
Map对象的连接运算是将两个Map对象连接成一个新的Map对象,Map对象连接运算符是+。如果两个Map对象具有相同的key,则右边的值代替左边的值。
<#assign scores ={"语文":90, "数学":80}
+ {"数学":85, "英文":88}>
${scores.语文} --输出为-- 90
${scores.数学} --输出为-- 85
${scores.英文} --输出为-- 88
列表的项目是表达式,所以可以有下面的例子:
[2 + 2, [1, 2, 3, 4], "whatnot"]
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号
可以定义反递增的数字范围,如5..2
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] as x>
${x}
</#list>
输出结果为:星期一 星期二 星期三 星期四 星期五 星期六 星期日
集合连接运算符
将两个集合连接成一个新的集合,连接集合的运算符是+。
<#list ["星期一", "星期二", "星期三", "星期四"] + ["星期五", "星期六", "星期日"] as x>
${x}
</#list>
输出结果为:星期一 星期二 星期三 星期四 星期五 星期六 星期日
[color=blue][b]输出变量值[/b][/color]
FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性。
[b]顶层变量[/b]
直接放在数据模型中的值
对于顶层变量,直接用${variable}来输出变量值,变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头。
//创建数据模型
Map root = new HashMap();
//name是一个顶层对象
root.put("name", "Hoffman");
输出结以上值,使用:${name}
[b]集合元素[/b]
可根据集合元素的索引来输出集合元素。集合元素的索引以方括号指定。
注意:集合里第一个元素的索引是0。
假设有索引["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
输出第三个集合元素,使用:${week[2]}
[b]Map元素[/b]
Map对象可以是HashMap,也可以是JavaBean(对于JavaBean可以把其属性当作key,把属性值当作value)
使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字是任意表达式的结果。
[color=blue][b]字符串操作[/b][/color]
[b]字符串连接[/b]
两种方法:
1. 使用${..}(或#{..})在字符串常量部分插入表达式的值,从而完成字符串连接。
2. 直接使用连接运算符(+)来连接字符串
Map root = new HashMap();
root.put("user", "Hoffman");
将user变量的值和常量连接起来,有两种语法:
${"Hello ${user}!"}或
${"${user}${user}${user}${user}"}
${"Hello " + user + "!"}或
${user + user + user + user}
${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
[b]截取子串[/b]
Map root = new HashMap();
root.put("user", "Hoffman");
截取通过如下语法:
${user[0]}${user[4]}
${user[1..4]}
返回结果为:
Hm
offm
[color=blue][b]算术运算符[/b][/color]
FreeMarker支持的算术运算符包括:+、-、*、/、%。
操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"} 输出结果是:35
[color=blue][b]比较运算符[/b][/color]
=(或者==):两个值是否相等
!=:两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误。
Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的。
还有>(或者gt)、>=(或者gte)、<(或者lt)、<=(或者lte):
对数字和日期可以使用<、<=、>和>=,但不能用于字符串。
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况
例如<#if (x > y)>。
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=。
[color=blue][b]逻辑运算符[/b][/color]
逻辑与:&&(and)
逻辑或:||(or)
逻辑非:!(not)
逻辑运算符只能用于布尔值,否则会产生错误。
[color=blue][b]直接指定值[/b][/color]
使用直接指定值的语法让FreeMarker直接输出插值中的值,而不是输出变量值。直接指定值可以是字符串、数值、布尔值、集合和MAP对象。
如果字符串中包含特殊字符,需要转义。
${"文件保存在c:\\盘"} --输出为-- 文件保存在c:\盘
${'名字是\"Hoffman\"'} --输出为-- 名字是"Hoffman
注意:Map对象的key和value都是表达式,但是key必须是字符串
{"语文":85, "数学":83, "程序":99}
Map对象的连接运算是将两个Map对象连接成一个新的Map对象,Map对象连接运算符是+。如果两个Map对象具有相同的key,则右边的值代替左边的值。
<#assign scores ={"语文":90, "数学":80}
+ {"数学":85, "英文":88}>
${scores.语文} --输出为-- 90
${scores.数学} --输出为-- 85
${scores.英文} --输出为-- 88
列表的项目是表达式,所以可以有下面的例子:
[2 + 2, [1, 2, 3, 4], "whatnot"]
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号
可以定义反递增的数字范围,如5..2
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] as x>
${x}
</#list>
输出结果为:星期一 星期二 星期三 星期四 星期五 星期六 星期日
集合连接运算符
将两个集合连接成一个新的集合,连接集合的运算符是+。
<#list ["星期一", "星期二", "星期三", "星期四"] + ["星期五", "星期六", "星期日"] as x>
${x}
</#list>
输出结果为:星期一 星期二 星期三 星期四 星期五 星期六 星期日
[color=blue][b]输出变量值[/b][/color]
FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性。
[b]顶层变量[/b]
直接放在数据模型中的值
对于顶层变量,直接用${variable}来输出变量值,变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头。
//创建数据模型
Map root = new HashMap();
//name是一个顶层对象
root.put("name", "Hoffman");
输出结以上值,使用:${name}
[b]集合元素[/b]
可根据集合元素的索引来输出集合元素。集合元素的索引以方括号指定。
注意:集合里第一个元素的索引是0。
假设有索引["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
输出第三个集合元素,使用:${week[2]}
[b]Map元素[/b]
Map对象可以是HashMap,也可以是JavaBean(对于JavaBean可以把其属性当作key,把属性值当作value)
使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字是任意表达式的结果。
[color=blue][b]字符串操作[/b][/color]
[b]字符串连接[/b]
两种方法:
1. 使用${..}(或#{..})在字符串常量部分插入表达式的值,从而完成字符串连接。
2. 直接使用连接运算符(+)来连接字符串
Map root = new HashMap();
root.put("user", "Hoffman");
将user变量的值和常量连接起来,有两种语法:
${"Hello ${user}!"}或
${"${user}${user}${user}${user}"}
${"Hello " + user + "!"}或
${user + user + user + user}
${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
[b]截取子串[/b]
Map root = new HashMap();
root.put("user", "Hoffman");
截取通过如下语法:
${user[0]}${user[4]}
${user[1..4]}
返回结果为:
Hm
offm
[color=blue][b]算术运算符[/b][/color]
FreeMarker支持的算术运算符包括:+、-、*、/、%。
操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"} 输出结果是:35
[color=blue][b]比较运算符[/b][/color]
=(或者==):两个值是否相等
!=:两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误。
Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的。
还有>(或者gt)、>=(或者gte)、<(或者lt)、<=(或者lte):
对数字和日期可以使用<、<=、>和>=,但不能用于字符串。
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况
例如<#if (x > y)>。
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=。
[color=blue][b]逻辑运算符[/b][/color]
逻辑与:&&(and)
逻辑或:||(or)
逻辑非:!(not)
逻辑运算符只能用于布尔值,否则会产生错误。