freemarker是一个模板引擎: 是基于模板和要改变的数据,合并生成输出文本(HTML网页,电子邮件,配置文件,源代码)。是一个Java类库
上边显示,在后端将数据查出来,会将数据封装起来,称之为数据模型model 将一个前端的模板使用freemarker进行结合,就会生成一个页面。
数据模型+模板=输出 例子数据模型
模板
输出
freemarker使用步骤1:添加依赖
org.springframework.boot
spring-boot-starter-validation
org.springframework.boot
spring-boot-starter-freemarker
2 添加配置到配置文件
spring:
freemarker:
cache: false #关闭模板缓存,方便测试
settings:
template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
suffix: .ftl #指定Freemarker模板文件的后缀名
freemarker使用demo
1 创建模板
Hello World!
普通文本 String 展示:
Hello
对象Student中的数据展示:
姓名:${stu.name}
年龄:${stu.age}
2 创建数据模型
@Controller
public class Test01Basic {
@GetMapping("/test01-basic")
public String test01Basic(Model model) {
Student student = new Student();
student.setAge(18);
student.setMoney(20F);
student.setName("衡老师");
model.addAttribute("stu", student);
//这里返回的必须是模板的文件名称
return "01-basic";
}
}
合并的页面:
解释: 模型返回一个 01-basic 意思就是上边的模板名称。
在模型数据中将student对象添加到model中,key为stu 所以在上边的模板中就会stu.name 意思就是调用key为stu的值,将student对象调用出来然后再得到名称和年龄
注意:这里如果使用@RestController那么就会将返回的数据变为json,这不是想要的数据,所以要使用controller或者ViewAndModel
freemarker的基础使用 1 插值格式: ${....}
模板
Hello World!
普通文本 String 展示:
Hello
对象Student中的数据展示:
姓名:${stu.name}
年龄:${stu.age}
数据模型
@Controller
public class Test01Basic {
@GetMapping("/test01-basic")
public String test01Basic(Model model) {
Student student = new Student();
student.setAge(18);
student.setMoney(20F);
student.setName("衡老师");
model.addAttribute("stu", student);
//这里返回的必须是模板的文件名称
return "01-basic";
}
}
2 集合 list map
模板
Hello World!
<#-- list 数据的展示 -->
展示list中的stu数据:
| 序号 | 姓名 | 年龄 | 钱包 | 集合长度:${list?size} |
| ${stu_index+1} | ${stu.name} | ${stu.age} | ${stu.money!""} | |
| ${stu_index+1} | ${stu.name} | ${stu.age} | ${stu.money!""} |
<#-- Map 数据的展示 --> map数据的展示:
方式一:通过map['keyname'].property
输出stu1的学生信息:
姓名:${map['tudent1'].name}
年龄:${map['tudent1'].age}
方式二:通过map.keyname.property
输出stu2的学生信息:
姓名:${map.tudent2.name}
年龄:${map.tudent2.age}
遍历map中两个学生信息:
| 序号 | 姓名 | 年龄 | 钱包 |
| ${key_index} | ${map[key].name} | ${map[key].age} | <#--非空判断 如果money没有非空判断,那么Java中没有给money赋值,就会报错,这时候需要加入非空判断 非空有两种:1 ..money?? 2: ...money!"" -->${map[key].money!""} |
添加c函数:${point?c}
模型
@Controller
public class Test03ListAndMap {
@GetMapping("/03-List-Map")
public String test01Basic(Model model) {
Student tudent1 = new Student();
tudent1.setAge(18);
// tudent1.setMoney(20F);
tudent1.setName("衡老师");
tudent1.setBirthday(new Date());
model.addAttribute("stu", tudent1);
Student tudent2 = new Student();
tudent2.setAge(18);
// tudent2.setMoney(20F);
tudent2.setName("刘老师");
tudent2.setBirthday(new Date());
model.addAttribute("stu2", tudent2);
Student tudent3 = new Student();
tudent3.setAge(18);
// tudent3.setMoney(20F);
tudent3.setName("刘小平");
tudent3.setBirthday(new Date());
model.addAttribute("stu3", tudent3);
Student tudent4 = new Student();
tudent4.setAge(18);
// tudent4.setMoney(20F);
tudent4.setName("刘墩墩");
tudent4.setBirthday(new Date());
model.addAttribute("stu4", tudent4);
//将上边的对象存到list中,再将list存到model
ArrayList list = new ArrayList<>();
Collections.addAll(list, tudent1, tudent2, tudent3, tudent4);
model.addAttribute("list", list);
//将上边的对象存到map中,再将map存到model
Map map = new HashMap<>();
map.put("tudent2", tudent2);
map.put("tudent3", tudent3);
map.put("tudent4", tudent4);
map.put("tudent1", tudent1);
model.addAttribute("map", map);
model.addAttribute("point", 123456789765L);
return "03-List-Map";
}
}
结果
解释: 这里的map可以通过遍历key来完成. 集合中如果想要1,2,3有序显示可以使用${传过来的key_index}
3 if指令
| 姓名 | 年龄 | 钱包 | |
| ${stu_index} | ${stu.name} | ${stu.age} | ${stu.money} |
| ${stu_index} | ${stu.name} | ${stu.age} | ${stu.money} |
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>
4 空值判断
控制使用 ?? 代表是不是空
<#if stus??>
<#list stus as stu>
......
#list>
#if>
5 如期格式化
Hello World!
普通文本 String 展示:
Hello
对象Student中的数据展示:
姓名:${stu.name}
年龄:${stu.age}
价格:${stu.money}
<#--使用时间类型的参数,就要在前端指定需要使用的是什么类型的时间格式,date:年月日 time:时分秒 datetime:年月日时分秒 自定义时间格式:string("yyyy-MM-dd HH-mm-ss")-->
生日date:${stu.birthday?date}
生日time:${stu.birthday?time}
生日datetime:${stu.birthday?datetime}
生日string自定义时间:${stu.birthday?string("yyyy-MM-dd HH-mm-ss")}



