Freemarker概述
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
环境搭建
- 工程依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- apache 对 java io 的封装工具库 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency></dependencies>
- application.yml配置文件
server:port: 8881 #服务端口
spring:application:name: freemarker-demo #指定服务名freemarker:cache: false #关闭模板缓存,方便测试settings:template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试suffix: .ftl #指定Freemarker模板文件的后缀名
在resources\templates\目录下创建01-basic.ftl文件
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Hello World!</title>
</head>
<body>
<b>普通文本 String 展示:</b><br><br>
Hello ${name} <br>
<hr>
<b>对象Student中的数据展示:</b><br/>
姓名:${stu.name}<br/>
年龄:${stu.age}
<hr>
</body>
</html>
创建控制器
package com.heima.freemarker.controller;import com.heima.freemarker.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/basic")public String hello(Model model){model.addAttribute("name","freemarker");Student student = new Student();student.setName("小明");student.setAge(18);model.addAttribute("stu",student);return "01-basic";}
}
Freemarker指令语法
基础语法
- 注释:<#-- -->
- 插值:${…}部分,freemarker会用真实的值代替${…}
- FTL(FreeMarker Template Language)指令:<# >FTL指令</#>
- 文本:不加任何标记会被直接输出
FTL指令
- 集合指令-List:<#list></#list>
<#list stus as stu><tr><td>${stu_index+1}</td> <!--从零开始--><td>${stu.name}</td><td>${stu.age}</td><td>${stu.money}</td></tr></#list>
上面的stus是model中的一个列表属性。
- 集合指令-Map
输出stu1的学生信息:<br/>
姓名:${stuMap['stu1'].name}<br/>
年龄:${stuMap['stu1'].age}<br/>
<br/>
<a href="###">方式二:通过map.keyname.property</a><br/>
输出stu2的学生信息:<br/>
姓名:${stuMap.stu2.name}<br/>
年龄:${stuMap.stu2.age}<br/><br/>
变量map
<#list stuMap?keys as key><tr><td>${key_index+1}</td><td>${stuMap[key].name}</td><td>${stuMap[key].age}</td><td>${stuMap[key].money}</td></tr></#list>
- if指令
<#if expression>
<#else>
</#if>
在freemarker中,判断是否相等,=与==号等价
空值处理
- 判断某变量是否存在使用“??”
用法为:variable??,如果该变量存在,返回true,否则返回false
<#if stus??><#list stus as stu></#list>
</#if>
- 缺失变量默认使用"!"
列如,${name!‘’}表示如果name为空显示空字符串
内建函数
内建函数语法格式:变量+?+函数名称
- stus集合的大小:${stus?size}
- 日期格式化:
3. 将json字符串转为对象
<#assign text="{'bank':'工商银行','account': '102313213123'}">
<#assign data=text?eval/>
开户行:${data.bank} 账号:${data.account}
输出静态化文件
实现思路
使用freemarker原生Api将页面生成html文件
@SpringBootTest(classes = FreemarkerDemoApplication.class)
@RunWith(SpringRunner.class)
public class FreemarkerTest {@Autowiredprivate Configuration configuration;@Testpublic void test() throws IOException, TemplateException {Template template = configuration.getTemplate("02-list.ftl");/*** 合成方法*/template.process(getData(),new FileWriter("g:/list.html"));}private Map getData(){Map<String,Object> map = new HashMap<>();//------------------------------------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<Student> stus = new ArrayList<>();stus.add(stu1);stus.add(stu2);//向model中存放List集合数据map.put("stus",stus);//------------------------------------//创建Map数据HashMap<String,Student> stuMap = new HashMap<>();stuMap.put("stu1",stu1);stuMap.put("stu2",stu2);// 3.1 向model中存放Map数据map.put("stuMap", stuMap);return map;}
}