本章节将介绍 FreeMarker 中的表达式。
当我们需要给 ${}(插值) 或者指令的参数提供值时,可以使用变量或其他复杂的表达式。 例如,我们设 x 为 8,y 为 5,那么 (x + y)/2 的值就会被处理成数字类型的值6.5。
在我们展开细节之前,先来看一些具体的例子:
当给 ${}(插值)提供值时:插值的使用方式为, 把它放到你想输出文本的位置上,然后值就可以打印出来了。 即 ${(5 + 8)/2} 会打印出 ''6.5'' 来。
当给指令的参数提供值时:在前面章节我们已经介绍了什么是指令,以及简单指令的用法。这里以 <#if> 指令为例:<#if expression>...</#if>。 这里的表达式计算结果必须是布尔类型的。比如:<#if 2 < 3> 中的 2 < 3 (2小于3) 是结果为 true 的布尔表达式。
下面给出了 FreeMarker 的全部表达式类型,提供快速预览和查询:
直接指定值
字符串: "FreeMarker" 或者 'FreeMarker' 或者 "It's \"quoted\""(内部的双引号需要转义 \") 或者 'It\'s "quoted"'(内部单引号需要转义 \') 或者 r"C:\raw\string"(r 表示字符串不进行转义,见 实例1)
数字: 100,-100,3.14
布尔值: true, false
序列: ["hxstrive", true, 123.45](创建一个序列或数组)值域:0..9(生成0到9数字序列), 0..<10 或 0..!10(生成0到小于10的数字序列), 0..(生成0到无穷大数字序列)见 实例2
哈希表: {"name":"hxstrive", "url":"https://www.hxstrive.com"},就是一个 JSON 对象
检索变量
顶层变量:user
从哈希表中检索数据:user.name,user["name"](访问 user 对象下面的 name 属性)
从序列中检索数据: products[5](访问序列中第6个元素)
特殊变量: .main
字符串操作
插值(或连接): "Hello ${user}!" (或 "Hello " + user + "!")
获取一个字符: name[0]
字符串切分: 包含结尾: name[0..4],不包含结尾: name[0..<5],基于长度(宽容处理): name[0..*5],去除开头: name[5..],见 实例3
序列操作
连接: users + ["guest"]
序列切分:包含结尾: products[20..29], 不包含结尾: products[20..<30],基于长度(宽容处理): products[20..*10],去除开头: products[20..]
哈希表操作
连接: passwords + { "joe": "secret42" }
算术运算: (x * 1.5 + 10) / 2 - y % 100
比较运算: x == y, x != y, x < y, x > y, x >= y, x <= y, x lt y(小于), x lte y(小于等于), x gt y(大于), x gte y(大于等于), 等等......
逻辑操作: !registered && (firstVisit || fromEurope),其中:! 非、&& 与、|| 或
内建函数: name?upper_case, path?ensure_starts_with('/'),其中:upper_case 和 ensure_starts_with 是内部函数;
方法调用: repeat("What", 3)
处理不存在的值:
默认值: name!"unknown" 或者 (user.name)!"unknown" 或者 name! 或者 (user.name)! 或者 name?default("unknown")
检测不存在的值: name?? 或者 (user.name)??
赋值操作: =, +=, -=, *=, /=, %=, ++, --
<html> <head> <title>表达式</title> </head> <body> <!-- 需要手动处理转义 --> <p>${"C:\\demo\\red\\index.html"}</p> <!-- 如果需要处理的字符太多,快捷处理 --> <p>${r"C:\demo\red\index.html"}</p> </body> </html>
输出结果:
<html> <head> <title>表达式</title> </head> <body> <p>C:\demo\red\index.html</p> <p>C:\demo\red\index.html</p> </body> </html>
<#-- 生成 0 到 9 的数字序列 --> <p><#list 0..9 as item>${item}<#sep>,</#list></p> <#-- 生成 0 到小于 10 的数字序列 --> <p><#list 0..<10 as item>${item}<#sep>,</#list></p> <p><#list 0..!10 as item>${item}<#sep>,</#list></p> <#-- 生成 0 到无穷大的数字序列 --> <p><#list 0.. as item>${item}<#sep>,</#list></p>
输出结果:
<p>0,1,2,3,4,5,6,7,8,9</p> <p>0,1,2,3,4,5,6,7,8,9</p> <p>0,1,2,3,4,5,6,7,8,9</p> <p>0,1,2,3,4,5,6,....,n</p>
<#-- 字符串分割 --> <#assign host="https://www.hxstrive.com"> <p> ${host[0..6]} </p> <p> ${host[0..<6]} </p> <p> ${host[0..*100]} </p> <p> ${host[7..]} </p>
输出结果:
<p> https:// </p> <p> https:// </p> <p> https://www.hxstrive.com </p> <p> www.hxstrive.com </p>
更多表达式相关知识,继续查看下一章……