freemarker之模板开发(模板表达式之直接指定值--详细)
----------
freemarker之模板(表达式之直接指定值--详细)
1.字符串
在文本中确定字符串值的方法是看引号和单引号,比如:"some text"或'some text',这两种形式是
相等的。如果文本本身包含用于字符引用的引号或反斜杠时,应该在它们的前面再加一个反斜杠,这
就是转义。
2.数字
输入不带引号的数字就可以直接指定一个数字,必须使用点作为小数的分隔符而不能是其他的分组分隔符。
3.布尔值
直接写true或false就表征一个布尔值了,不需使用引号。
4.序列
指定一个文字的序列,使用逗号来分隔其中的每个子变量,然后把整个列表放到方括号中,如:
<#list ['winter','spring','summer','autumn'] as x>
${x}
</#list>
也可以用start..end定义存储数字范围的序列,这里的start和end是处理数字值表达式,比如:2..5
和[2,3,4,5]是相同的。但是使用前者会更有效率(内存占用少而且速度快)。可以看出前者也没有使用
方括号,这样也可以用来定义递减的数字范围,比如5..2。(此外,还可以省略end,只需5..即可,但
这样序列默认包含5,6,7,等递增量直到无穷大)
5.哈希表
在模板中指定一个哈希表,就可以遍历用逗号分隔开的"键/值"对,把列表放到花括号内。键和值成对出
现并以冒号分隔。看这个例子:{"name":"green mouse","price":150}。注意:用来检索的键必须是字符
串类型。
6.检索变量
a.顶层变量
为了访问顶层的变量,可以简单地使用变量名。如:${user}
b.从哈希表中检索数据
如例,我们可以通过book.title来读取title表达式。我们想指定同一个表达式的子变量,那么还有另外
一种语法格式:book["title"]。下面这样混合的方式也是可以的:
book.author.name,book["author"].name,book.author["name"],book["author"]["name"]
c.从序列中检索数据
这和从哈希表中检索是相同的,但是你只能使用方括号语法形式来进行,而且方括号内的表达式最终必须
是一个数字而不是字符串。如:animails[0].name。
d.特殊变量
特殊变量是由FreeMarker引擎本身定义的,语法如下:.variable_name。通常情况下是不需使用特殊变量的。
7.字符串操作
a.插值(或连接)
如果要在字符串中插入表达式的值,可以使用${...},如:${"hello ${user}!"}
b.获取一个字符
在给定索引值时可以获取字符串中的一个字符,如例,假设user是"Big Joe",那么:
${user[0]},${user[4]},将打印出:B,J.
8.序列操作
a.连接
序列的连接可以使用+号来进行,例如:
<#list ["Joe","Fred"] + ["Julia","Kate"] as user>
${user]
</#list>
要注意不要在很多重复连接时使用序列连接操作,比如在循环中往序列上追加项目,而这样的使用是可以的:
<#list users + admins as person>。尽管序列连接的很快,而且速度是和被连接序列的大小相独立的,
但是最终的结果序列的读取却比原先的两个序列慢那么一点。
9.序列切分
使用[firstindex..lastindex]可以获取序列中的一部分,这里的firstindex和lastindex表达式的结果是数字。
如:seq="abcdefg", seq[1..4]就等于bcde ,seq[3..]等于defg
10.哈希表操作
a.连接
像连接字符串那样,也可以使用+号的方式来连接哈希表。如果两个哈希表含有键相同的项,那么在+号右侧的
哈希表中的项目优先。如:
<#assign ages={"Joe":23,"Fred":25}+{"Joe":30,"Julia":18}>
Joe is ${ages.Joe}
Fred is ${ages.Fred}
Julia is ${ages.Julia}
将会打印出:
Joe is 30
Fred is 25
Julia is 18
11.算数运算
算数运算包含基本的四则运算和求模运算。如例:
${100-x*x},${x/2},${12*10}
有时我们只想获取计算结果的整数部分,这可以使用内建函数int来解决。如例:
${(x/2)?int}
${1.1?int}
12.比较运算
测试两个值相等使用= ,如例:<#if user = "Big Joe">
测试两个值不等使用!=,如例:<#if user != "Big Joe">
对数字和日期类型的比较,也可以使用<,<=,>=和>。不能把它们当作字符串来比较。如:
<#if x <= 12>
xxxxxx
</#if>
使用>=和>的时候有一点小问题。FreeMarker解释>的时候可以把当当作FTL标签的结束符。为了
避免这种问题,不得不将表达式放到括号内:<#if (x>y)>。
13.逻辑操作
常用的逻辑操作符:
a.逻辑或:||
b.逻辑与: &&
c.逻辑非:!
逻辑操作符仅仅在布尔值之间有效,若用在其它类型将会产生错误导致模板执行中止。
如例:
<#if x<12 && color = "green">
we have less than 12 things,and they are green.
</#if>
14.内建函数
正如其名,内建函数提供始终可用的内置功能。使用内建函数的语法和访问哈希表子变量的语法
很像,除了使用?号来代替点,其他都一样。例如得到字符串的大写形式:user?upper_case。
现在,我们只需要了解一些重要的内建函数就可以了。
字符串使用的内建函数:
a.html: 字符串中所有的特殊html字符都需要用实体引用来代替(比如:<代替<)
b.cap_first: 字符串的第一个字母变为大写形式
c.lower_case: 字符串的小写形式
d.upper_case: 字符串的大写形式
e.trim: 去掉字符串首尾的空格
序列使用的内建函数:
a.size: 序列中元素的个数
数字使用的内建函数:
a.int: 数字的整数部分(比如:-1.9?int就是-1)
15.方法调用
可以使用方法调用操作来使用一个已经定义过的方法。方法调用的语法形式是使用逗号来分割在
括号内的表达式而形成的参数列表,这些值就是参数。如例:
${repeat("what",3)}
16.处理不存在的值
a.默认值
使用形式概览:unsafe_expr!default_expr或unsafe_expr!或(unsafe_expr)!default_expr
或(unsafe_expr)!
如例:${mouse!"No mouse."}
默认值可以是任何类型的表达式,也可以不必是字符串。你可以这样写:hits!0或
colors!["red","green","blue"]。
注意:如果在!后面有复合表达式,如1+x,通常使用括号,像:${x!(1+y)},这样就根据
你的意图来确定优先级。
如果默认值被省略了,那么结果将会是空串,空序列或空哈希表。如果想让默认值为0或false。
则注意不能省略它。
在不是顶层变量时,默认值操作符可以有两种使用方式:
如例:product.color!"red"
如果是这样的写法,那么在product中,当color不存在时(返回"red")将会被处理。但是如果连
product都不存在时将不会处理。也就是说这样写时变量product必须存在,否则会报错。
如果:(product.color)!"red"
这时,如果product不存在或者product存在而color不存在,都能显示默认值"red",而不会报错。
b.检测不存在的值
使用形式如:unsafe_expr??或者(unsafe_expr)??
这个操作符告诉我们一个值是否存在。基于这种情况,结果是true或false。
如例:
<#if mouse??>
Mouse found
</#else>
No mouse found
</#if>
访问非顶层变量的使用规则和默认值操作符也是一样的,即product.color??和(product.color)??。
17.括号
括号可以用来给表达式分组
如:${3*2+2} , ${3*(2+2)} , ${("green"+"mouse")?upper_case}
18.表达式中的空格
FTL忽略表达式中的多余空格
19.操作符的优先级(略)