type
Post
status
Published
date
Sep 16, 2021
slug
summary
tags
模板引擎
category
技术分享
icon
password
模板引擎是服务端渲染,页面静态化技术之一,也是MVC架构中的V(视图层)技术,和JSP类似
页面静态化:
- 例如有的列表页访问量大,但数据变化频率不高,每一次访问都需要查询数据库动态获取数据进行展示,对数据库造成很大的访问压力
- 页面静态化将原来动态网页(如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生产的静态网页,这样用户在访问网页时,服务器直接响应静态html页面,而不进行动态查询数据库
- Freemarker、theymeleaf这类页面静态化技术就是用于生成这样的静态html页面
FreeMarker
- FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出
FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP
- 可以生成页面模板,右键模板甚至代码模板
快速入门
环境搭建
创建 maven 工程,并导入Freemarker的maven坐标

<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
创建模板文件
模板文件的类型:
- 文本:直接输出的部分,如html标签
- 注释:
<#—我是注释—>
- 插值:
${ }占位符,用数据模型中的部分数据进行代替输出
- FTL指令:即FreeMarker的指令,和HTML标签类似,实现逻辑化的功能,名字前加#予以区分
模板文件后缀可以任意,一般建议为
.ftl 新版为 .ftlh手动生成静态文件
- 创建 Configuration 对象,直接 new 一个对象,的参数是 freemarker的版本号
- 设置模板文件所在的路径,默认字符集等熟悉
- 加载目录下的模板文件,创建一个模板对象
- 准备模板数据,可以是 pojo 也可以是 map,一般是 Map
- 创建一个 Writer 对象,一般创建 FileWriter 对象,指定生成的文件名。
- 调用模板对象的 process 方法输出文件
- 关闭流
public void test1() throws IOException, TemplateException { //创建fm配置对象 Configuration configuration = new Configuration(Configuration.getVersion()); //设置模板文件所在目录,默认编码 configuration.setDirectoryForTemplateLoading(new File("src/main/webapp/WEB-INF/ftl")); configuration.setDefaultEncoding("UTF-8"); //加载模板文件 Template template = configuration.getTemplate("test.ftl"); //准备模板数据,构造模板文件 Map map = new HashMap(); map.put("result","success"); map.put("name", "LYJ"); map.put("message","never be failed"); //创建Writer输出流对象,输出静态文件 FileWriter writer = new FileWriter("src/main/webapp/test.html"); //输出文件 template.process(map,writer); writer.close(); }
Freemarker 指令
指令格式:
<#指令名 属性="属性值">直接输出值
<div>${"hello,我是直接输出的字符串"}</div><div>${"我的文件保存在C:\\盘"}</div>
- \ 符号需要转义,也可以用r标记后面的字符串不转义
<div>${r"我的文件保存在C:\盘"}</div>
数字
<!--定义数字类型变量,并以人民币或百分数形式展示--> ${num?string.currency} ${num?string.percent}
布尔
根据布尔类型的值输出不同的变量
<#assign flag=true><div>${flag?string("a","b")}</div>
集合
定义集合并输出
<#list ["星期一", "星期二", "星期三"] as x> <br>${x}<br/> </#list> #也可以用 1..5 表示 1 到 5,5..1 表示 5 到 1 <#list 5..1 as x>
Map
<#list {"name":"java","address":"www.java.org"}?keys as x> ${x} </#list> <#list {"name":"java","address":"www.java.org"}?values as x> ${x} </#list>
输出变量
- 普通变量:
<div>${name}</div>
- 集合
<table border="1"> <#list users as u> <tr> <td>${u.username}</td> <td>${u.address}</td> </tr> </#list> </table> <div> ${users[3].username} </div> <#list users[3..5] as u> <tr> <td>${u.username}</td> <td>${u.address}</td> <td>${u_index}</td> #获取正在遍历的集合下表 <td>${u_has_next?string("yes","no")}</td> #还有没有下一个 </tr> </#list>
- map
#直接获取值 <div>${info.wechat}</div> <div>${info['site']}</div> #获取所有的key或所有的value <#list info?keys as key> <div>${key}--${info[key]}</div> </#list> <#list info?values as value> <div>${value}</div> </#list>
常用指令
assign用于在页面上定义一个变量,包括简单类型和复杂类型(json对象)
<#assign linkman="周先生"> 联系人:${linkman} <#assign info={"mobile":"13812345678",'address':'北京市昌平区'}> 电话:${info.mobile}
include用于模板文件嵌套(包含其他模板文件)
<#include "head.ftl"/>
if-else用于判断,按条件渲染
<#if success=true> ==或者=都行 你已通过实名认证 <#else> 你未通过实名认证 </#if>
Relate Posts