阿里巴巴做国际网站多少钱,做版式的网站,产品开发过程,重庆网络推广交流原文网址#xff1a;FreeMarker--表达式和运算符的用法(全面/有示例)_IT利刃出鞘的博客-CSDN博客
简介
本文介绍FreeMarker的表达式和运算符的用法。
表达式是FreeMarker的核心功能。表达式放置在插值语法#xff08;${...}#xff09;之中时#xff0c;表明需要输出表达…原文网址FreeMarker--表达式和运算符的用法(全面/有示例)_IT利刃出鞘的博客-CSDN博客
简介
本文介绍FreeMarker的表达式和运算符的用法。
表达式是FreeMarker的核心功能。表达式放置在插值语法${...}之中时表明需要输出表达式的值表达式语法也可以与FreeMarker标签结合用于控制输出。
直接指定值
a、字符串
${我的文件保存在C:\\盘}
${我名字是\annlee\}
输出结果是:
我的文件保存在C:\盘
我名字是annlee
FreeMarker支持如下转义字符:
\;双引号(u0022) \;单引号(u0027) \\;反斜杠(u005C) \n;换行(u000A) \r;回车(u000D) \t;Tab(u0009) \b;退格键(u0008) \f;Form feed(u000C) \l; \g; \a; \{;{ \xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符. 如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式可以在指定字符串内容的引号前增加r标记在r标记后的文件将会直接输出。看如下代码:
${r${foo}}
${rC:\foo\bar}
输出结果是:
${foo}
C:\foo\bar
b、数值
表达式中的数值直接输出不需要引号小数点使用.分隔不能使用分组,符号。FreeMarker目前还不支持科学计数法所以1E3是错误 的。FreeMarker表达式中使用数值需要注意以下几点
数值不能省略小数点前面的0所以.5是错误的写法数值8 , 8 , 8.00都是相同的
c、布尔值
直接使用true和false不使用引号。
d、日期型 FreeMarker支持date、time、datetime三种类型这三种类型的值无法直接指定通常需要借助字符串的date、time、datetime三个内建函数进行转换才可以
#assign test1 2009-01-22?date(yyyy-MM-dd) /;#assign test2 16:34:43?time(HH:mm:ss) /#assign test2 2009-01-22 17:23:45?datetime(yyyy-MM-dd HH:mm:ss) /${test1?string.full}
e、集合
集合以方括号包括,各集合元素之间以英文逗号,分隔,看如下的例子:
#list [星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期天] as x
${x}
/#list
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天
除此之外,集合元素也可以是表达式,例子如下:
[2 2, [1, 2, 3, 4], whatnot] 还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2
f、Map集合
Map对象使用花括号包括,Map中的key-value对之间以英文冒号:分隔,多组key-value对之间以英文逗号,分隔.下面是一个例子:
{语文:78, 数学:80}
Map对象的key和value都是表达式但是key必须是字符串.
输出变量值 FreeMarker的表达式输出变量时这些变量可以是顶层变量也可以是Map对象中的变量还可以是集合中的变量并可以使用点(.)语法来访问Java对象的属性。下面分别讨论这些情况
a、顶层变量
所谓顶层变量就是直接放在数据模型中的值例如有如下数据模型:
Map root new HashMap(); //创建数据模型
root.put(name,annlee); //name是一个顶层变量
对于顶层变量直接使用${variableName}来输出变量值变量名只能是字母数字下划线$和#的组合且不能以数字开头号.为了输出上面的name的值可以使用如下语法:
${name}
b、输出集合元素 如果需要输出集合元素则可以根据集合元素的索引来输出集合元素集合元素的索引以方括号指定.假设有索引:
[星期一星期二星期三星期四星期五星期六星期天]
该索引名为week如果需要输出星期三则可以使用如下语法:
${week[2]} //输出第三个集合元素
此外FreeMarker还支持返回集合的子集合如果需要返回集合的子集合则可以使用如下语法:
week[3..5] //返回week集合的子集合子集合中的元素是week集合中的第4-6个元素
c、输出Map元素 这里的Map对象可以是直接HashMap的实例甚至包括JavaBean实例对于JavaBean实例而言我们一样可以把其当成属性为key属性值为value的Map实例。为了输出Map元素的值可以使用点语法或方括号语法。假如有下面的数据模型:
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);
为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:
book.author.name //全部使用点语法
book[author].name
book.author[name] //混合使用点语法和方括号语法
book[author][name] //全部使用方括号语法
使用点语法时变量名字有顶层变量一样的限制但方括号语法没有该限制因为名字可以是任意表达式的结果。
字符串操作 FreeMarker的表达式对字符串操作非常灵活可以将字符串常量和变量连接起来也可以返回字符串的子串等。
字符串连接有两种语法:
使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接.直接使用连接运算符来连接字符串
例如有如下数据模型:
Map root new HashMap(); root.put(user,annlee);
下面将user变量和常量连接起来:
${hello, ${user}!} //使用第一种语法来连接
${hello, user !} //使用号来连接
上面的输出字符串都是hello,annlee!可以看出这两种语法的效果完全一样。
值得注意的是${..}只能用于文本部分不能用于表达式下面的代码是错误的:
#if ${isBig}Wow!/#if
#if ${isBig}Wow!/#if
应该写成
#if isBigWow!/#if
截取子串可以根据字符串的索引来进行截取子串时如果只指定了一个索引值则用于取得字符串中指定索引所对应的字符;如果指定两个索引值则返回两个索引中间的字符串子串.假如有如下数据模型
Map root new HashMap(); root.put(book,struts2,freemarker);
可以通过如下语法来截取子串:
${book[0]}${book[4]} //结果是su
${book[1..4]} //结果是tru
集合连接运算符
这里所说的集合运算符是将两个集合连接成一个新的集合连接集合的运算符是看如下的例子:
#list [星期一,星期二,星期三] [星期四,星期五,星期六,星期天] as x
${x}
/#list
输出结果是:
星期一 星期二 星期三 星期四 星期五 星期六 星期天
Map连接运算符 Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象Map对象的连接运算符是如果两个Map对象具有相同的key则右边的值替代左边的值。看如下的例子:
#assign scores {语文:86,数学:78} {数学:87,Java:93}
语文成绩是${scores.语文}
数学成绩是${scores.数学}
Java成绩是${scores.Java}
输出结果是:
语文成绩是86
数学成绩是87
Java成绩是93
算术运算符 FreeMarker表达式中完全支持算术运算FreeMarker支持的算术运算符包括: - * / % 看如下的代码
#assign x5
${ x * x - 100 }
${ x /2 }
${ 12 %10 }
输出结果是:
-75 2.5 2
在表达式中使用算术运算符时要注意以下几点:
运算符两边的运算数字必须是数字 使用运算符时如果一边是数字一边是字符串就会自动将数字转换为字符串再连接如:${3 5}结果是:35
使用内建的int函数可对数值取整如:
#assign x5
${ (x/2)?int }
${ 1.1?int }
${ 1.999?int }
${ -1.1?int }
${ -1.999?int }
结果是:
2 1 1 -1 -1
比较运算符
表达式中支持的比较运算符有如下几个:
或者:判断两个值是否相等. !:判断两个值是否不等. 或者gt:判断左边值是否大于右边值 或者gte:判断左边值是否大于等于右边值 或者lt:判断左边值是否小于右边值 或者lte:判断左边值是否小于等于右边值
注意和!可以用于字符串数值和日期来比较是否相等但和!两边必须是相同类型的值否则会产生错误而且FreeMarker是精确比较xx X是不等的。其它的运行符可以作用于数字和日期但不能作用于字符串大部分的时候使用gt等字母运算符代替会有更好的效果因为 FreeMarker会把解释成FTL标签的结束字符当然也可以使用括号来避免这种情况如:#if (xy)
逻辑运算符
逻辑运算符有如下几个
逻辑与 逻辑或|| 逻辑非! 逻辑运算符只能作用于布尔值否则将产生错误
内建函数 FreeMarker还提供了一些内建函数来转换输出可以在任何变量后紧跟??后紧跟内建函数就可以通过内建函数来轮换输出变量。下面是常用的内建的字符串函数:
html对字符串进行HTML编码 cap_first使字符串第一个字母大写 lower_case将字符串转换成小写 upper_case将字符串转换成大写 trim去掉字符串前后的空白字符
下面是集合的常用内建函数
size获取序列中元素的个数
下面是数字值的常用内建函数
int取得数字的整数部分结果带符号
例如:
#assign testTom Jerry
${test?html}
${test?upper_case?html}
结果是:
Tom amp; Jerry TOM amp; JERRY
空值处理运算符
概述 在FreeMarker中不存在的变量和null都属于空值。 FreeMarker对空值的处理非常严格FreeMarker的变量必须有值没有被赋值的变量就会抛出异常因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误如缺失潜在的变量命名或者其他变量错误。
为了处理缺失变量FreeMarker提供了两个运算符。
!指定缺失变量的默认值 ??判断某个变量是否存在
用!指定默认值时不要求默认值的类型和变量类型相同。
用??运算符非常简单它总是返回一个布尔值用法为variable??如果该变量存在返回true否则返回false。
!运算符的用法有如下两种:
variable!variable!defaultValue
第1种用法不给缺失的变量指定默认值表明默认值是空字符串长度为0的集合或者长度为0的Map对象。
第2种用法给缺失的变量指定默认值。
示例
通过exists关键字或者??运算符判断是否存在
都将返回一个布尔值
#if user.name?exists//TO DO
/#if#if user.age??//TO DO
/#if
忽略null值
假设前提user.name为null
${user.name} 异常${user.name!} 显示空白空字符串${user.name!vakin} 若user.name不为空则显示本身的值否则显示vakin${user.name?default(vakin)} 若user.name不为空则显示本身的值否则显示vakin${user.name???string(user.name,vakin)} 若user.name不为空则显示本身的值否则显示vakin
加不加括号
product.color?? 只测试color是否为null
(product.color)?? 测试product和color是否为null
运算符的优先级
FreeMarker中的运算符优先级如下(由高到低排列):
一元运算符! 内建函数? 乘除法* / % 加减法- 比较 (lt lte gt gte)相等 ! 逻辑与 逻辑或||