1 Freemarker简介
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。
中文文档地址:freemarker.foofun.cn/
2 SpringBoot整合Freemarker
2.1 准备工作
1、添加pom依赖
<!--freemarker依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2、配置freemarker
spring:
freemarker:
charset: UTF-8
content-type: text/html
suffix: .ftl
template-loader-path: classpath:/templates/
2.2 基本使用
1、创建ftl模板文件
在类路径下创建templates文件夹,创建一个"test.ftl"模板文件。
<html>
<head>
<title>Hello Freemarker</title>
</head>
<body>
<#--
freemarker 页面的语法构成:
1. 注释
2. 表达式 ${...}
3. 普通文本,基本的html标签
4. 指令
-->
<div>Welcome ${username}!</div>
</body>
</html>
freemarker模板和html文件结合使用,在html中会包含一些 FreeMarker的表达式和指令,用于生成动态内容。
2、在Controller中输出字符串展示
@Controller
@RequestMapping("free")
public class FreemarkerController {
@GetMapping("/hello")
public String hello(Model model){
//定义输出到模板的内容
String username="迷茫";
model.addAttribute("username",username);
//返回的字符串匹配到指定目录下freemarker模板文件的名称
return "test";
}
}
注意,使用模板引擎时,controller注解不能使用@RestController。
启动项目后,访问接口,可以看到ftl中的${username}会被代码中设置的数据内容替换。
2.3 freemarker语法
1、输出对象
模板内容:
<div>
用户id: ${employee.employeeId}<br>
用户姓名: ${employee.username}<br>
地址: ${employee.address}<br>
入职日期: ${employee.entryDate?string('yyyy-MM-dd')}<br>
是否离职: ${employee.haveResign?string('是', '否')}<br>
工资: ${employee.income}<br>
伴侣: ${employee.spouse.username},${employee.spouse.age}岁<br>
</div>
设置数据:
Employee employee = new Employee();
employee.setEmployeeId(1001);
employee.setUsername("mimang");
employee.setEntryDate(new Date());
employee.setAddress("shanghai");
employee.setIncome(1000.99);
employee.setHaveResign(false);
Spouse spouse = new Spouse();
spouse.setUsername("Lucy");
spouse.setAge(25);
employee.setSpouse(spouse);
model.addAttribute("employee", employee);
访问接口页面展示内容:
用户id: 1,001
用户姓名: mimang
地址: shanghai
入职日期: 2023-02-05
是否离职: 否
工资: 1,000.99
伴侣: Lucy,25岁
2、输出list和map
<div>
<#list employee.list as item>
<div>
<span>${item.name}</span>
<span>${item.age}</span>
</div>
</#list>
</div>
<br>
<div>
<#list employee.map?keys as key>
<div>
${employee.map[key]}
</div>
</#list>
</div>
3、指令if
<div>
<#if (employee.income < 500.0)>
低收入人群
</#if>
<br>
<#if employee.employeeId == 1001>
用户id是1001
</#if>
<br>
<#if employee.haveResign>
员工已离职
<#else>
员工在职
</#if>
<br>
<#if employee.spouse??>
员工有配偶
<#elseif !employee.spouse??>
员工无配偶
</#if>
</div>
3、页面静态化
结合动态数据生成静态化HTML文件
// 1.创建一个Configuration对象
Configuration configuration = new Configuration(Configuration.getVersion());
// 2.设置模板文件所在的路径。
String path = Objects.requireNonNull(FreemarkerController.class.getResource("/")).getPath();
configuration.setDirectoryForTemplateLoading(new File(path + "/templates"));
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 3.设置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 4.加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate("test.ftl");
// 5.获取模板需要渲染的数据
Map<String, Object> data = new HashMap<>();
data.put("username", "mimang");
Path targetPath = Paths.get(htmlTarget);
if (Files.notExists(targetPath)) {
Files.createDirectories(targetPath);
}
// 6.创建Writer对象,写入渲染后的模板文件
FileWriter fileWriter = new FileWriter(targetPath.resolve("test.html").toFile());
template.process(data, fileWriter);
fileWriter.close();
通过上面的方法,可以将动态数据结合模板,渲染为一个HTML文件,存放到指定位置。