- 注释:即<#-- -->,介于其之间的内容会被freemarker忽略
- 插值:即 ${..} 部分,freemarker会用真实的值代替${..}
- FTL指令:<# >FTL指令#> ,和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
- 文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。
模板:
Hello World!
<#-- list 数据的展示 -->
展示list中的stu数据:
| 序号 | 姓名 | 年龄 | 钱包 |
| ${stu_index+1} | ${stu.name} | ${stu.age} | ${stu.money} |
<#-- Map 数据的展示 --> map数据的展示:
方式一:通过map['keyname'].property
输出stu1的学生信息:
姓名:${stuMap['stu1'].name}
年龄:${stuMap['stu1'].age}
方式二:通过map.keyname.property
输出stu2的学生信息:
姓名:${stuMap.stu2.name}
年龄:${stuMap.stu2.age}
遍历map中两个学生信息:
| 序号 | 姓名 | 年龄 | 钱包 |
| ${key_index} | ${stuMap[key].name} | ${stuMap[key].age} | ${stuMap[key].money} |
${k_index}: index:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始
数据模型:
@GetMapping("/list")
public String list(Model model){
//------------------------------------
Student stu1 = new Student();
stu1.setName("小强");
stu1.setAge(18);
stu1.setMoney(1000.86f);
stu1.setBirthday(new Date());
//小红对象模型数据
Student stu2 = new Student();
stu2.setName("小红");
stu2.setMoney(200.1f);
stu2.setAge(19);
//将两个对象模型数据存放到List集合中
List stus = new ArrayList<>();
stus.add(stu1);
stus.add(stu2);
//向model中存放List集合数据
model.addAttribute("stus",stus);
//------------------------------------
//创建Map数据
HashMap stuMap = new HashMap<>();
stuMap.put("stu1",stu1);
stuMap.put("stu2",stu2);
// 3.1 向model中存放Map数据
model.addAttribute("stuMap", stuMap);
return "02-list";
}
3、if指令
freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否则跳过内容不再输出。
格式:<#if >
使用list指令中测试数据模型,判断名称为小红的数据字体显示为红色。
| 姓名 | 年龄 | 钱包 | |
| ${stu_index} | ${stu.name} | ${stu.age} | ${stu.money} |
| ${stu_index} | ${stu.name} | ${stu.age} | ${stu.money} |
结果为:
4、运算符
4.1 算数运算符
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:
-
加法: +
-
减法: -
-
乘法: *
-
除法: /
-
求模 (求余): %
模板代码:
算数运算符
100+5 运算: ${100 + 5 }
100 - 5 * 5运算:${100 - 5 * 5}
5 / 2运算:${5 / 2}
12 % 10运算:${12 % 10}
除了 + 运算以外,其他的运算只能和 number 数字类型的计算。
4.2 比较运算符
-
=或者==:判断两个值是否相等.
-
!=:判断两个值是否不等.
-
>或者gt:判断左边值是否大于右边值
-
>=或者gte:判断左边值是否大于等于右边值
-
<或者lt:判断左边值是否小于右边值
-
<=或者lte:判断左边值是否小于等于右边值
= 和 == 模板代码:
Hello World!
比较运算符
- =/== 和 != 比较:
- <#if "xiaoming" == "xiaoming"> 字符串的比较 "xiaoming" == "xiaoming" #if>
- <#if 10 != 100> 数值的比较 10 != 100 #if>
- 其他比较
- <#if 10 gt 5 > 形式一:使用特殊字符比较数值 10 gt 5 #if>
- <#-- 日期的比较需要通过?date将属性转为data类型才能进行比较 --> <#if (date1?date >= date2?date)> 形式二:使用括号形式比较时间 date1?date >= date2?date #if>
比较运算符注意:
-
=和!=可以用于字符串、数值和日期来比较是否相等
-
=和!=两边必须是相同类型的值,否则会产生错误
-
字符串 "x" 、"x " 、"X"比较是不等的.因为FreeMarker是精确比较
-
其它的运行符可以作用于数字和日期,但不能作用于字符串
-
使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符
-
可以使用括号来避免这种情况,如:<#if (x>y)>
4.3 逻辑运算符
-
逻辑与:&&
-
逻辑或:||
-
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误 。
模板代码:
逻辑运算符
<#if (10 lt 12 )&&( 10 gt 5 ) >
(10 lt 12 )&&( 10 gt 5 ) 显示为 true
#if>
<#if !false>
false 取反为true
#if>
5、空值处理
5.1 判断某变量是否存在使用 “??”
用法为:variable??,如果该变量存在,返回true,否则返回false
例:为防止stus为空报错可以加上判断如下:
<#if stus??>
<#list stus as stu>
......
#list>
#if>
5.2 缺失变量默认值使用 “!”
-
使用!要以指定一个默认值,当变量为空时显示默认值
例: ${name!''}表示如果name为空显示空字符串。
-
如果是嵌套对象则建议使用()括起来
例: ${(stu.bestFriend.name)!''}表示,如果stu或bestFriend或name为空默认显示空字符串。
内建函数语法格式: 变量+?+函数名称
6.1 和到某个集合的大小
${集合名?size}
6.2 日期格式化
显示年月日: ${today?date} 显示时分秒:${today?time} 显示日期+时间:${today?datetime} 自定义格式化: ${today?string("yyyy年MM月")}
6.3 内建函数c
model.addAttribute("point", 102920122);
point是数字型,使用${point}会显示这个数字的值,每三位使用逗号分隔。
如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出${point?c}
6.4 将json字符串转成对象
一个例子:
其中用到了 assign标签,assign的作用是定义一个变量。
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
模板代码:
inner Function
获得集合大小
集合大小:${stus?size}
获得日期
显示年月日: ${today?date}
显示时分秒:${today?time}
显示日期+时间:${today?datetime}
自定义格式化: ${today?string("yyyy年MM月")}
内建函数C
没有C函数显示的数值:${point}
有C函数显示的数值:${point?c}
声明变量assign
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
内建函数Controller数据模型:
@GetMapping("innerFunc")
public String testInnerFunc(Model model) {
//1.1 小强对象模型数据
Student stu1 = new Student();
stu1.setName("小强");
stu1.setAge(18);
stu1.setMoney(1000.86f);
stu1.setBirthday(new Date());
//1.2 小红对象模型数据
Student stu2 = new Student();
stu2.setName("小红");
stu2.setMoney(200.1f);
stu2.setAge(19);
//1.3 将两个对象模型数据存放到List集合中
List stus = new ArrayList<>();
stus.add(stu1);
stus.add(stu2);
model.addAttribute("stus", stus);
// 2.1 添加日期
Date date = new Date();
model.addAttribute("today", date);
// 3.1 添加数值
model.addAttribute("point", 102920122);
return "04-innerFunc";
}



