首先,你需要在你的项目中添加 Freemarker 的依赖。如果是 Maven 项目,你要在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
你可以创建一个.ftl
(Freemarker 模板文件)文件,比如叫orderConfirmation.ftl
。在这个文件中,模板中的插值表达式最终会被freemarker替换成具体的数据。你可以这样写邮件模板:
尊敬的${customerName},
您的订单${orderId}已经确认,商品包括:
<#list productList as product>
- ${product.name}(数量:${product.quantity})
</#list>
总价是${totalPrice}。
感谢您的购买!
${customerName}
、${orderId}
、${productList}
和${totalPrice}
就是变量,<#list>
是 Freemarker 的一个指令,用于循环遍历商品列表。这就像是你在试卷模板上把填空题的空白处和一些特殊的答题要求(比如列表答题)都写好了。 首先,你要创建一个Configuration
对象,这是 Freemarker 的核心配置对象。
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class FreemarkerExample {
public static void main(String[] args) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
try {
// 设置模板文件所在的目录
cfg.setDirectoryForTemplateLoading(new File("templates"));
// 获取模板文件
Template template = cfg.getTemplate("orderConfirmation.ftl");
// 创建数据模型
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("customerName", "张三");
dataModel.put("orderId", "123456");
ArrayList<Product> productList = new ArrayList<>();
Product product1 = new Product("手机", 1);
Product product2 = new Product("耳机", 2);
productList.add(product1);
productList.add(product2);
dataModel.put("productList", productList);
dataModel.put("totalPrice", 5000.0);
// 合并模板和数据模型
StringWriter writer = new StringWriter();
template.process(dataModel, writer);
System.out.println(writer.toString());
} catch (IOException | TemplateException e) {
e.printStackTrace();
}
}
}
class Product {
private String name;
private int quantity;
public Product(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
public String getName() {
return name;
}
public int getQuantity() {
return quantity;
}
}
Configuration
对象,然后设置了模板文件所在的目录(templates
),接着获取了orderConfirmation.ftl
模板。之后创建了一个Map
作为数据模型,把顾客姓名、订单编号、商品列表和总价等数据放进去。最后,通过template.process
方法把数据模型和模板合并,生成最终的邮件内容并打印出来。这就好比你把具体的答案(顾客信息等数据)填到试卷模板(模板文件)里,然后得到了一份完整的试卷(生成的邮件内容)。StringWriter
是 Java 中的一个类,它属于java.io
包。它的主要作用是将字符数据写入一个字符串缓冲区,你可以把它想象成是一个特殊的 “容器”,这个容器专门用来收集字符,最后可以方便地获取这些字符组成的字符串。
在 Freemarker 中的作用(结合上面的例子)
template.process
方法需要一个Writer
对象作为参数来接收生成的文本内容。StringWriter
就充当了这个接收者的角色。template.process
)在生产产品(生成的邮件内容),需要有一个地方来存放这些产品,StringWriter
就是这个存放产品的仓库。当template.process
方法执行时,它会把根据模板和数据生成的文本内容一个字符一个字符地 “放进” 这个StringWriter
中。writer.toString()
就可以把StringWriter
中收集到的字符内容转换为一个完整的字符串,这样就可以方便地在控制台打印出来或者用于其他用途,比如发送邮件时作为邮件的正文。因篇幅问题不能全部显示,请点此查看更多更全内容