FreeMarker 是一款 基于模板和要改变的数据 的模板引擎, 是用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker 模板的工作方式为 MVC
(模型、视图、控制器)模式,常用来在 MVC 模式的 Web 开发框架中生成 HTML 页面。
更多关于 FreeMarker 的介绍可以参考官方文档:http://freemarker.foofun.cn/
一个包含变量的 HTML 文本(变量的占位符为${}
):
<html>
...
hello ${name}
...
html>
Java 实体对象设置相应的属性变量 name
:
...
model.setName("Jack");
...
经过 FreeMarker 模板的转换得到最终结果:
<html>
...
hello Jack
...
html>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-freemarkerartifactId>
<version>2.3.12.RELEASEversion>
dependency>
在 resources/templates
路径下添加 demo.ftl
模板:
<div style="max-width: 760px; width: 100%;">
<div style="font-size: 18px; font-family: 'Courier New',serif">
This is Title: ${title}
div>
<div style="font-size: 15px; font-family: 'Arial',serif">
This is a content: ${content}
div>
div>
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;
/**
* @author wangtingyun
*/
@Slf4j
public class FreemarkerUtils {
/**
* 处理 FTL 模板
* @param templateFileName FTL模板文件名
* @param model Java实体类
* @return 经过Freemarker处理后的FTL模板
*/
public static String process(String templateFileName, Map<String, Object> model) {
// 定义字符串输出流
StringWriter stringWriter = new StringWriter();
try {
// 配置Freemarker
Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
cfg.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(),"/templates");
cfg.setDefaultEncoding("UTF-8");
cfg.setNumberFormat("#.##");
// 加载FTL模板
Template temp = cfg.getTemplate(templateFileName);
// 处理FTL模板
temp.process(model, stringWriter);
// 返回处理结果
stringWriter.flush();
return stringWriter.toString();
} catch (Exception e) {
log.error(e.getMessage());
} finally {
try {
// 记得关闭输出流
stringWriter.close();
} catch (IOException ex) {
log.error(ex.getMessage());
}
}
return null;
}
}
@SpringBootTest
class DemoTests {
@Test
void Test() {
Map<String, Object> map = new HashMap<>(8);
map.put("title", "Hello Java");
map.put("content", "This is written in Java");
System.out.println(FreemarkerUtils.process("demo.ftl", map));
}
}
下面是输出结果:
<div style="max-width: 760px; width: 100%;">
<div style="font-size: 18px; font-family: 'Courier New',serif">
This is Title: Hello Java
div>
<div style="font-size: 15px; font-family: 'Arial',serif">
This is a content: This is written in Java
div>
div>
重点: 在 Freemarker 模板中,变量的引用方式为 ${}
,变量的引用不仅可以直接引用变量名对应的对象本身比如:${name}
,还可以引用对象中的属性变量比如:${student.name}
,这里的 student.name 表示引用 student 对象的 name 属性变量。
<#if>
标签<#if>
为条件判断标签,其的使用方式为:
<#if condition>
...
<#elseif condition2>
...
<#else>
...
#if>
注意:
condition
将被计算成布尔值的表达式,可以是 Java 对象提供的变量;elseif
和 else
是可选的。下面是一个例子:
<div>
<#if count == 1>
<div>
这是条件1
div>
<#elseif count == 2>
<div>
这是条件2
div>
<#else>
<div>
这是其他条件
div>
#if>
div>
注意: 这里的 count
是 Java 对象的变量,并且,在 Freemarker 的标签中,变量的引用直接使用变量名即可,不需要使用 ${}
,但在标签以外的地方对变量的引用必须使用 ${}
符号。
<#list>
标签<#list>
标签为循环变量标签,其使用方式为:
<#list sequence as item>
Part repeated for each item
#list>
这里:
sequence
为想要迭代的项,可以 Java 集合对象变量;item
为循环变量的名称。下面是一个例子:
<#list users as user>
<p>${user}p>
#list>
输出结果为:
<p>Jackp>
<p>Marryp>
<p>Andyp>
更多 Freemarker 指令可以参考官方文档:http://freemarker.foofun.cn/ref_directives.html