3.2 输出变量值html
FreeMarker的表达式输出变量时,这些变量能够是顶层变量,也能够是Map对象中的变量,还能够是集合中的变量,并能够使用点(.)语法来访问Java对象的属性.下面分别讨论这些状况函数
1,顶层变量
所谓顶层变量就是直接放在数据模型中的值,例若有以下数据模型:
Map root = new HashMap(); //建立数据模型
root.put("name","annlee"); //name是一个顶层变量编码
对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,能够使用以下语法:
${name}spa
2,输出集合元素
若是须要输出集合元素,则能够根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:
["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,若是须要输出星期三,则能够使用以下语法:
${week[2]} //输出第三个集合元素htm
此外,FreeMarker还支持返回集合的子集合,若是须要返回集合的子集合,则能够使用以下语法:
week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素对象
3,输出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);blog
为了访问数据模型中名为struts2的书的做者的名字,能够使用以下语法:
book.author.name //所有使用点语法
book["author"].name
book.author["name"] //混合使用点语法和方括号语法
book["author"]["name"] //所有使用方括号语法索引
使用点语法时,变量名字有顶层变量同样的限制,但方括号语法没有该限制,由于名字能够是任意表达式的结果.开发
3.3, 字符串操做字符串
FreeMarker的表达式对字符串操做很是灵活,能够将字符串常量和变量链接起来,也能够返回字符串的子串等.
字符串链接有两种语法:
1,使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串链接.
2,直接使用链接运算符+来链接字符串
例若有以下数据模型:
Map root = new HashMap(); root.put("user","annlee");
下面将user变量和常量链接起来:
${"hello, ${user}!"} //使用第一种语法来链接
${"hello, " + user + "!"} //使用+号来链接
上面的输出字符串都是hello,annlee!,能够看出这两种语法的效果彻底同样.
值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:<#if isBig>Wow!</#if>
截取子串能够根据字符串的索引来进行,截取子串时若是只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;若是指定两个索引值,则返回两个索引中间的字符串子串.假若有以下数据模型:
Map root = new HashMap(); root.put("book","struts2,freemarker");
能够经过以下语法来截取子串:
${book[0]}${book[4]} //结果是su
${book[1..4]} //结果是tru
3.4 集合链接运算符
这里所说的集合运算符是将两个集合链接成一个新的集合,链接集合的运算符是+,看以下的例子:
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
${x}
</#list>
输出结果是:星期一 星期二 星期三 星期四 星期五 星期六 星期天
3.5 Map链接运算符
Map对象的链接运算符也是将两个Map对象链接成一个新的Map对象,Map对象的链接运算符是+,若是两个Map对象具备相同的key,则右边的值替代左边的值.看以下的例子:
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
语文成绩是${scores.语文}
数学成绩是${scores.数学}
Java成绩是${scores.Java}
输出结果是:
语文成绩是86
数学成绩是87
Java成绩是93
3.6 算术运算符
FreeMarker表达式中彻底支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看以下的代码:
<#assign x=5>
${ x * x - 100 }
${ x /2 }
${ 12 %10 }
输出结果是:
-75 2.5 2
在表达式中使用算术运算符时要注意如下几点:
1,运算符两边的运算数字必须是数字
2,使用+运算符时,若是一边是数字,一边是字符串,就会自动将数字转换为字符串再链接,如:${3 + "5"},结果是:35
使用内建的int函数可对数值取整,如:
<#assign x=5>
${ (x/2)?int }
${ 1.1?int }
${ 1.999?int }
${ -1.1?int }
${ -1.999?int }
结果是:2 1 1 -1 -1
3.7 比较运算符
表达式中支持的比较运算符有以下几个:
1,=或者==:判断两个值是否相等.
2,!=:判断两个值是否不等.
3,>或者gt:判断左边值是否大于右边值
4,>=或者gte:判断左边值是否大于等于右边值
5,<或者lt:判断左边值是否小于右边值
6,<=或者lte:判断左边值是否小于等于右边值
注意:=和!=能够用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,不然会产生错误,并且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符能够做用于数字和日期,但不能做用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,由于FreeMarker会把>解释成FTL标签的结束字符,固然,也能够使用括号来避免这种状况,如:<#if (x>y)>
3.8 逻辑运算符
逻辑运算符有以下几个:
逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能做用于布尔值,不然将产生错误
3.9 内建函数
FreeMarker还提供了一些内建函数来转换输出,能够在任何变量后紧跟?,?后紧跟内建函数,就能够经过内建函数来轮换输出变量.下面是经常使用的内建的字符串函数:
html:对字符串进行HTML编码
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串先后的空白字符
下面是集合的经常使用内建函数
size:获取序列中元素的个数
下面是数字值的经常使用内建函数
int:取得数字的整数部分,结果带符号
例如:
<#assign test="Tom & Jerry">
${test?html}
${test?upper_case?html}
结果是:Tom & Jerry TOM & JERRY
3.10 空值处理运算符
FreeMarker对空值的处理很是严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,由于FreeMarker未赋值的变量强制出错能够杜绝不少潜在的错误,如缺失潜在的变量命名,或者其余变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,咱们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它没法理解null值,null值和不存在的变量彻底相同.
为了处理缺失变量,FreeMarker提供了两个运算符:
!:指定缺失变量的默认值
??:判断某个变量是否存在
其中,!运算符的用法有以下两种:
variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,代表默认值是空字符串,长度为0的集合,或者长度为0的Map对象.
使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符很是简单,它老是返回一个布尔值,用法为:variable??,若是该变量存在,返回true,不然返回false
3.11 运算符的优先级
FreeMarker中的运算符优先级以下(由高到低排列):
1,一元运算符:!
2,内建函数:?
3,乘除法:*, / , %
4,加减法:- , +
5,比较:> , < , >= , <= (lt , lte , gt , gte)
6,相等:== , = , !=
7,逻辑与:&&
8,逻辑或:||
9,数字范围:..
实际上,咱们在开发过程当中应该使用括号来严格区分,这样的可读性好,出错少。
本文转载自OECP社区http://www.oecp.cn/hi/hailang/blog/386