Spring Boot学习笔记:FreeMarker

267 阅读2分钟

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文件,存放到指定位置。