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坐标
notion image
<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

手动生成静态文件

  1. 创建 Configuration 对象,直接 new 一个对象,的参数是 freemarker的版本号
  1. 设置模板文件所在的路径,默认字符集等熟悉
  1. 加载目录下的模板文件,创建一个模板对象
  1. 准备模板数据,可以是 pojo 也可以是 map,一般是 Map
  1. 创建一个 Writer 对象,一般创建 FileWriter 对象,指定生成的文件名。
  1. 调用模板对象的 process 方法输出文件
  1. 关闭流
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>
模板引擎:ThymeleafMaven 聚合工程实例