方案概述

image-lmtp.png

FreeMarker 教程:模板引擎的快速入门与实践

一、什么是 FreeMarker?

FreeMarker 是一款模板引擎,用于基于模板和动态数据生成输出文本(例如 HTML 网页、电子邮件、配置文件或源代码)。它本质上是一个 Java 类库,主要面向开发者,用于嵌入到开发的产品中。

FreeMarker 的主要功能是将静态模板中的占位符替换为实际数据,从而生成最终的输出。例如:

模板文件 (freemarker.ftl)

<html>
  <body>
    Hello, ${name}!
  </body>
</html>

数据模型

Map<String, Object> model = new HashMap<>();
model.put("name", "World");

生成结果

<html>
  <body>
    Hello, World!
  </body>
</html>

二、环境搭建

  1. 创建测试工程 创建一个 freemarker-demo 工程,用于测试 FreeMarker 的功能。可以使用 Spring Boot 快速搭建。

  2. Maven 依赖配置 在项目的 pom.xml 文件中引入以下依赖:

<dependencies>
    <!-- Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- freemarker starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    
    <!-- Juint -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
    <!-- Apache Commons IO -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>
  1. 配置文件 (application.yml) 设置 FreeMarker 的模板路径和缓存行为:

server:
  port: 8881  # 服务端口
​
spring:
  application:
    name: freemarker-demo
  freemarker:
    cache: false  # 关闭缓存以便测试
    suffix: .ftl  # 模板文件后缀名
    template-loader-path: classpath:/templates  # 模板路径
    settings:
      template_update_delay: 0  # 模板更新检查延迟时间,设为0表示立即检查

三、快速入门

  1. 准备模板文件resources/templates 目录下创建模板文件 freemarker.ftl

<!DOCTYPE html>
<html>
<head>
    <title>FreeMarker Example</title>
</head>
<body>
    <b>普通文本展示:</b><br>
    Hello ${name}<br>
​
    <hr>
    <b>对象 Student 数据展示:</b><br>
    姓名:${stu.name}<br>
    年龄:${stu.age}<br>
</body>
</html>
  1. Java 代码实现 编写测试类加载模板并生成输出文件:

@Test
public void testFreemarker() throws Exception {
    // 初始化 FreeMarker 配置
    Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
    configuration.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));
​
    // 加载模板文件
    Template template = configuration.getTemplate("freemarker.ftl");
​
    // 准备数据模型
    Map<String, Object> dataModel = new HashMap<>();
    dataModel.put("name", "FreeMarker");
    Student stu = new Student();
    stu.setName("张三");
    stu.setAge(18);
    dataModel.put("stu", stu);
​
    // 合成模板与数据
    FileWriter writer = new FileWriter("output.html");
    template.process(dataModel, writer);
    writer.close();
}
  1. 运行结果 生成的 output.html 文件内容如下:

<!DOCTYPE html>
<html>
<head>
    <title>FreeMarker Example</title>
</head>
<body>
    <b>普通文本展示:</b><br>
    Hello FreeMarker<br>
​
    <hr>
    <b>对象 Student 数据展示:</b><br>
    姓名:张三<br>
    年龄:18<br>
</body>
</html>

四、FreeMarker 的常用指令语法

  1. 插值表达式 使用 ${} 表示变量,FreeMarker 会将其替换为数据模型中的值。

    Hello ${name}
  2. 注释 使用 <#-- ... --> 表示注释,注释内容不会出现在输出结果中。

    <#-- 这是注释 -->
  3. 集合操作 遍历列表和 Map:

    <#list students as stu>
        ${stu.name} - ${stu.age}<br>
    </#list>
  4. 条件判断 使用 <#if><#else> 实现条件逻辑:

    <#if stu.age > 18>
        ${stu.name} 是成年人
    <#else>
        ${stu.name} 是未成年人
    </#if>
  5. 空值处理

    • 判断变量是否存在:variable??

    • 设置默认值:${variable!'默认值'}

    姓名:${stu.name!'匿名'}
  6. 内建函数 使用内置函数对变量进行操作:

    集合大小:${students?size}<br>
    当前时间:${now?datetime}

五、总结

FreeMarker 是一款功能强大的模板引擎,特别适合在 Java 项目中生成动态内容。通过其简单直观的语法和强大的指令功能,开发者可以快速实现模板渲染,极大提高开发效率。