Java学习第八十部分——Freemarker
一、前言提要
Apache FreeMarker是一个用Java 编写的模板引擎。它的核心是:数据(Java 对象) + 模板(*.ftl 文件) = 文本输出(HTML、XML、邮件、源码、配置文件等任何纯文本格式)。
二、关键特性
分离表现层与业务逻辑:模板只关心“如何展示”,不关心“数据怎么来”。
语法简洁:`${user.name}`、`[#if]`、`[#list]` 等标签直观易读。
零依赖 Servlet:不依赖 Web 环境,可在普通 Java 程序中生成静态文件(如生成代码、邮件模板)。
国际化支持:内建多语言、数字/日期格式化。
安全:默认对 HTML 转义,防止 XSS(可配置)。
三、功能用法
功能分类 | 关键语法/示例 | 典型场景 |
---|---|---|
1. 取值(插值) | ${user.name} | 页面渲染、邮件模板、短信模板 |
2. 数字格式化 | ${salary?c} → 原样 | 报表、电商价格展示 |
3. 字符串处理 | ${str?substring(1,4)} 截取 | 文案统一加工、关键词脱敏 |
4. 日期格式化 | ${date?string('yyyy-MM-dd')} | 订单时间、消息时间 |
5. 条件判断 | <#if score < 60> 不及格 | 个性化提示、颜色区分状态 |
6. 循环遍历 | <#list users as u> | 表格、下拉框、枚举展示 |
7. 宏(可复用片段) | <#macro card title> | 公共组件、代码片段复用 |
8. 命名空间/模块化 | <#import "/common/commons.ftl" as c> | 多人协作、宏库共享 |
9. assign 临时变量 | <#assign total=0> | 循环累加、复杂计算 |
10. HTML 转义 | ${content?html} 防 XSS | 富文本、评论展示 |
11. 缺失值处理 | ${user.nick!'匿名'} 空值兜底 | 避免 NPE,提高容错 |
12. switch-case | <#switch day> | 多分支文案,如周菜谱 |
四、使用场景
+-------------------+---------------------------+
| 场景 | 示例输出文件类型 |
+===================+=============+
| 动态网页渲染 | HTML、CSS、JS |
+-------------------+---------------------------+
| 代码生成器 | Java、SQL、Proto |
+-------------------+---------------------------+
| 邮件/短信模板 | 纯文本或 HTML 邮件 |
+-------------------+---------------------------+
| 配置文件生成 | YAML、JSON、XML |
+-------------------+---------------------------+
五、与Java关系
1. 运行依赖
- Java 依赖:FreeMarker 本身是一个JAR 包(`freemarker-2.3.x.jar`),需运行在JVM上。
- 数据交互:模板中使用的所有变量(如 `${user.name}`)必须来自Java对象(Map、JavaBean、List 等)。
2. 工作流程
// 1. 准备数据(Java 对象)
Map<String, Object> data = new HashMap<>();
data.put("user", new User("Alice", 25));// 2. 加载模板(*.ftl 文件)
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
Template template = cfg.getTemplate("user.ftl");// 3. 合并数据与模板,输出文本
Writer out = new StringWriter();
template.process(data, out); // 输出结果:Hello, Alice! You are 25.
六、与Java生态集成
七、与JSP对比
维度 | FreeMarker | JSP |
---|---|---|
定位 | 通用模板引擎 | 专用于 Servlet Web |
语法 | ${} 、[#if] | <% %> 、JSTL 标签 |
依赖 | 不依赖 Servlet | 必须运行在 Servlet 容器 |
功能 | 更强大的内建函数(如序列化、日期格式化) | 依赖 JSTL 扩展 |
八、总结归纳
FreeMarker 是一个Java 世界的“胶水层”,将后端数据与前端展示/文本输出解耦。无论是生成动态网页,还是批量生成代码,它都能通过简单的模板语法和 Java 对象高效完成任务。