表达式快速预览

本章节将介绍 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)??

  • 赋值操作: =, +=, -=, *=, /=, %=, ++, --

实例1:演示禁用字符串转义符号“r”。

<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>

实例2:下面实例演示了怎样生成数字序列。

<#-- 生成 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>

实例3:演示字符串切割

<#-- 字符串分割 -->
<#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>

更多表达式相关知识,继续查看下一章……

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号