FreeMarker学习笔记
文章目录
⼀、概述
FreeMarker是⼀款模板引擎:即⼀种基于模板和要改变的数据,并⽤来⽣成输出⽂本(HTML⽹⻚,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。它不是⾯向最终⽤户的,⽽是⼀个Java类库,是⼀款程序员可以嵌⼊他们所开发产品的组件。
模板编写为 FTL (FreeMarker Template Language)。
设计思想:模板 + 数据 —> ⽂本输出
官网:https://freemarker.apache.org/
FreeMarker可以用于实现页面静态化。
页面静态化:即将页面的内容以静态文件的方式进行展示输出。
静态页面(如:.html,.js,.css文件);直接响应给浏览器
动态页面:(如:.jsp文件)。运行机制:.jsp–>.java–>.class—>响应浏览器
静态页面的访问速度最快。
⼆、第⼀个Freemarker程序
Maven依赖jar
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
创建模板
创建一个FreeMarker的模板index.ftl(后缀名也可以是.html,官方推荐.ftl后缀)
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h1>您好:${name}</h1>
</body>
</html>
注:${name} 是freemarker的取值表达式
准备数据 并根据模板⽣成静态⻚
package com.demo.freemarker;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class FreemarkerTest {
public static void main(String[] args) throws IOException, TemplateException {
// 1. 准备数据
Map<String,Object> dataMap = new HashMap<String, Object>();
dataMap.put("name","张三");
// 2. 设置Freemarker的版本
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
// 3. 设置模板目录
configuration.setDirectoryForTemplateLoading(new File("E:\\Java\\3_Framework\\ideaCode\\freemarker_demo\\src\\main\\webapp\\WEB-INF\\template"));
// 4. 设置编码方式
configuration.setDefaultEncoding("UTF-8");
// 5. 读取模板
Template template = configuration.getTemplate("index.ftl");
// 6. 输出静态页面
template.process(dataMap,new FileWriter("E:\\index.html"));
}
}
三、FTL语法
1. 语法类型
- Interpolation 插值 ${ key名 }
- FTL tags 标签 <# 标签名></#标签名>
- Comments 注释 <#-- 注释内容 —> ; Freemarker的注释不会显示在生成的源文件中,而jsp的注释会显示在源代码中。
- <@>:宏(略),⾃定义标签
2. 具体示例
1. 取值
# =========================================================
Map<String,Object> dataMap = new HashMap<String, Object>();
# =========================================================
# ---------- 普通类型 ------------
<h1>您好:${name}</h1>
# ------------------------------------
// 数据封装
dataMap.put("name","张三");
# -------------- 对象类型 -------------
<h1>您好:${user.name}</h1>
# ------------------------------------
// 对象类型 数据封装
User user = new User();
user.setId(1);
user.setName("⼩红");
dataMap.put("user",user);
# ------------ 数字类型 ---------------
# ------------------------------------
# assign ⽤以声明当前模板临时变量
<#assign answer=42>
# --------------取值--------------------
# 与 ${answer} 作用相同,获取字符串类型
${answer?string}
# 获取数字类型
${answer?string.number}
# 获取货币类型:¥ 23
${answer?string.currency}
# 获取百分制类型: 25%
${answer?string.percent}
# ------------------------------------
# ------ ⽇期类型 ------
# 获取日期:2012-09-09
${date?date}
# 获取时间:11:12:12
${date?time}
# 获取日期与时间:2012-09-09 11:12:12
${date?datetime}
# ------------------------------------
# ⾃定义⽇期格式
${date?string("yyyy年MM⽉dd⽇")}
或
${date?string("yyyy年MM⽉dd⽇ hh:mm:dd")}
# ------------------------------------
# -------------- 布尔值处理 --------------
# 获取字面值(实际值 true | false)b:表示key;c:表示value字面值
${b?c}
# 根据boolean值获取值:值为true时表达式值为yes;值为false时表达式值为no
${b?string('yes', 'no')}
# ----------------------------------------