1. 直接输出值
字符串
可以直接输出一个字符串:
${"hello666666"}
${"C:\"}
${r"C:"}
需要进行转义。
如果感觉转义太麻烦,可以在目标字符串的引号前增加 r 标记,在 r 标记后的文本内容将会直接输出
数字
在 FreeMarker 中使用数值需要注意以下几点:
-
数值不能省略小数点前面的0,所以".5"是错误的写法。
-
数值 8 , +8 , 8.00 都是相同的。
数字还有一些其他的玩法:
<#assign price=99>
${price?string.currency}
${price?string.percent}
布尔
布尔类型可以直接定义,不需要引号,像下面这样:
<#assign flage=true>
${flage?string("yes","no")}
首先使用 <#assign flage=true> 定义了一个 Boolean 类型的变量,然后在 div 中展示,如果 flag e为 true,则输出 yes,否则输出 no。
集合
集合也可以现场定义现场输出,例如如下方式定义一个 List 集合并显示出来:
<#list users as user>
${user}
#list>
<#list ["1","2","3","4"] as x>
${x}
#list>
集合中的元素也可以是一个表达式:
<#list [2+2,"javaboy"] as x>
${x}
#list>
集合中的第一个元素就是 2+2 的结果,即 4。
也可以用 1..5 表示 1 到 5,5..1 表示 5 到 1,例如:
<#list 5..1 as x>
${x}
#list>
<#list 1..5 as x>
${x}
#list>
也可以定义 Map 集合,Map 集合用一个 {} 来描述:
<#list {"name":"hello","address":"666"}?keys as x>
${x}
#list>
<#list {"name":"hello","address":"666"}?values as x>
${x}
#list>
上面两个循环分别表示遍历 Map 中的 key 和 values。
3.1.2 输出变量
创建一个 HelloController,然后添加如下方法:
@Controller
public class UserController {
@RequestMapping("/hello")
public String hello(Model model){
List users=new ArrayList<>();
for (int i = 0; i < 10; i++) {
user user=new user();
user.setId(i);
user.setUsername("name"+i);
user.setPassword("password"+i);
users.add(user);
}
model.addAttribute("users",users);
List user=new ArrayList<>();
for (int i = 0; i < 10; i++) {
user user1=new user();
user1.setId(i);
user1.setUsername("name"+i);
user1.setPassword("address"+i);
user.add(user1);
}
model.addAttribute("user",user);
Map map=new HashMap<>();
map.put("name","xiaoxiao");
map.put("age",18);
model.addAttribute("map",map);
model.addAttribute("name","xiao6666");
model.addAttribute("birthday",new Date());
return "hello";
}
}
接下来我们在模版文件中对这里的普通变量、List 集合以及 Map 分别进行展示。
普通变量
普通变量的展示很容易,如下:
${name}
集合
集合的展示就有很多不同的玩法了。
直接遍历:
| ${u.username} | ${u.address} |
输出集合中第四个元素:
${users[3].username}
输出集合中第 4-6 个元素,即子集合:
| ${u.username} | ${u.address} |
遍历时,可以通过 变量_index 获取遍历的下标:
| ${u.username} | ${u.address} | ${u_index} | ${u_has_next?string("yse","no")} |
|---|
Map
直接获取 Map 中的值有不同的写法,如下:
${map.name}
${map.age}
获取 Map 中的所有 key,并根据 key 获取 value:
<#list map?keys as key>
${key}--${map[key]}
#list>
获取 Map 中的所有 key/value:
<#list map?keys as key>
${key}
#list>
<#list map?values as value>
${value}
#list>
字符串操作
字符串的拼接有两种方式:
${"hello ${name}"}
${"hello "+ name}
也可以从字符串中截取子串:
${name[0]}${name[1]}
${name[0..2]}
最终显示效果如下:
3.1.4 集合操作
集合或者 Map 都可以相加。
集合相加:
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
${x}
#list>
Map 相加:
<#list (map+{"gitee":"https://gitee.com"})?keys as key>
${key}
#list>
<#list users + user as x>
${x}
#list>
3.1.5 算术运算符
+、—、*、/、% 运算都是支持的。
<#assign age=99>
${age*99/99+99-1}
3.1.6 比较运算
比较运算和 Thymeleaf 比较类似:
-
= 或者 == 判断两个值是否相等。
-
!= 判断两个值是否不等。
-
> 或者 gt 判断左边值是否大于右边值。
-
>= 或者 gte 判断左边值是否大于等于右边值。
-
< 或者 lt 判断左边值是否小于右边值。
-
<= 或者 lte 判断左边值是否小于等于右边值。
可以看到,带 < 或者 > 的符号,也都有别名,建议使用别名。
<#assign age=99>
<#if age=99>age=99#if>
<#if age gt 98>age > 98#if>
<#if age gte 99>age >= 99#if>
<#if age lt 100>age < 100#if>
<#if age lte 99>age <= 99#if>
<#if age!=96>age!=96#if>
<#if age==99>age==99#if>
逻辑运算
逻辑运算符有三个:
-
逻辑与 &&
-
逻辑或 ||
-
逻辑非 !
逻辑运算符只能作用于布尔值,否则将产生错误。
<#assign age=99> <#if age=99 && 1==1>age=99 && 1==1#if> <#if age=99 || 1==0>age=99 || 1==0#if> <#if !(age gt 99)>!(age gt 99)#if>
3.1.8 空值处理
为了处理缺失变量,Freemarker 提供了两个运算符:
-
!:指定缺失变量的默认值
-
??:判断某个变量是否存在
如果某个变量不存在,则设置其为 javaboy,如下:
${aaa!"javaboy"}
如果某个变量不存在,则设置其为空字符串,如下:
${aaa!}
即,! 后面的东西如果省略了,默认就是空字符串。
判断某个变量是否存在:
<#if aaa??>aaa#if>
指输出了666
3.2 内建函数内建函数涉及到的东西比较多,可以参考官方文档:
http://freemarker.foofun.cn/ref_builtins.html
这里仅说一些比较常用的内建函数。
cap_first
使字符串第一个字母大写:
${"hello"?cap_first}
lower_case
将字符串转换成小写:
${"HELLO"?lower_case}
upper_case
将字符串转换成大写:
${"hello"?upper_case}
trim
去掉字符串前后的空白字符:
${" hello"?trim}
size
获取序列中元素的个数:
${users?size}
int
取得数字的整数部分,结果带符号:
${3.14?int}
日期格式化
${birthday?string("yyyy-MM-dd")}



