使用FreeMarker配置动态模板
FreeMarker动态模板
前言
当我们开发功能时,不仅要考虑当前,也要考虑之后的迭代.
对于邮件正文内容,有时候需要配置HTML格式,所以选择了FreeMarker
准备工作
- FreeMarker的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 其余Spring相关依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
FreeMarker
官方文档 http://freemarker.foofun.cn/
最简单的模板通常是普通的HTML文件,当然也可以用来写word,pdf之类
对于FreeMarker的模板语言,和动态sql有些相似既然是动态模板,那么是要传入数据的
http://freemarker.foofun.cn/dgui_datamodel_types.html
常用的传参类型有List,Map,自定义对象 在上方的官方文档中你可以查看支持的全部类型
代码构建
项目结构

创建 Configuration 实例
package com.lizi.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.annotation.PostConstruct;
import java.util.Locale;
/**
* @author lizi
* @description FreeMarkerUtil
* @date 2022/01/01
*/
@Component
@Slf4j
public class FreeMarkerUtil {
private static Configuration configuration = null;
@PostConstruct
public void init() {
if (null == configuration) {
// 设置版本号
configuration = new Configuration(Configuration.VERSION_2_3_23);
// ”/template“为模板文件来源
configuration.setClassForTemplateLoading(FreeMarkerTemplateUtils.class, "/template");
// 设置编码格式
configuration.setEncoding(Locale.CHINA, "UTF-8");
}
}
/**
* @param file template文件路径
* @param data 数据
* @return String
*/
public static String getResult(String file, Object data) {
String result = "";
try {
// 获取通用模板
Template template = configuration.getTemplate(file);
// 通过模板创建动态数据
result = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);
} catch (Exception e) {
log.error("processTemplateIntoString error : {} ", e.getMessage());
}
return result;
}
}
调用
package com.lizi.controller;
import com.lizi.Entity.Pokemon;
import com.lizi.util.FreeMarkerUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author lizi
* @description FreeMarkerController
* @date 2022/01/01
*/
@RestController
public class FreeMarkerController {
@PostMapping("/getTemplate")
public String getTemplate() {
// 创建数据模型
Map<String, Object> dataMap = new HashMap<>(16);
Map<String, Object> map = new HashMap<>(16);
map.put("珍珠", "pearl");
map.put("钻石", "diamond");
Pokemon pokemon=new Pokemon();
pokemon.setName("ground_dragon");
pokemon.setRace("108,130,95,80,85,102");
dataMap.put("strong",pokemon);
dataMap.put("pokemon", map);
dataMap.put("ground_dragon","108,130,95,80,85,102");
return FreeMarkerUtil.getResult("template.ftl", dataMap);
}
}
模板文件
对于模板语言,可以更多的去参考官方文档,
<html>
<#-- 传入类型是Map ${ground_dragon} 表示对Map.get("ground_dragon") -->
<td>${ground_dragon}</td>
<#-- 我传入的类型是Map 这里pokemon 表示Map.get("pokemon")之后获取的value 代码中也是一个Map -->
<#if pokemon?exists>
<#-- list,表示遍历 -->
<#list pokemon?keys as key>
<tr>
<td>${key}</td>
<td>${pokemon[key]}</td>
</tr>
</#list>
</#if>
<#-- Map.get("strong") 是一个自定义类 访问属性可以直接用.的方式获取 -->
<td>${strong.name}</td>
<td>${strong.race}</td>
</body>
</html>
调用结果
<html>
<td>108,130,95,80,85,102</td>
<tr>
<td>钻石</td>
<td>diamond</td>
</tr>
<tr>
<td>珍珠</td>
<td>pearl</td>
</tr>
<td>ground_dragon</td>
<td>108,130,95,80,85,102</td>
</body>
</html>
Tips
- 对于传入的数据模型,需要用Map做一层包装,不然会出错
- 如果对象可能不存在,需要做一层判断,不然会出错
使用FreeMarker配置动态模板的更多相关文章
- vert.x学习(六),动态模板与静态文件的结合
这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...
- SpringBoot下配置FreeMarker配置远程模版
需求产生原因 要求在同一个接口中,根据不同的参数,返回不同的视图结果 所有的视图中的数据基本一致 要求页面能静态化,优化SEO 例如:A接口返回客户的信息 客户A在调用接口时,返回其个性化定制的页面A ...
- 如何通过Spring Boot配置动态数据源访问多个数据库
之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...
- 使用freemarker生成xml模板
今天在java交流群里有个人问我如何用freemarker生成xml模板文件,可以手动配置参数,于是我到网上百度了一下.发现有一位同行的博文写的很nice,于是我就照着他的代码敲了一遍,最后实现了,本 ...
- 迷你MVVM框架 avalonjs 沉思录 第3节 动态模板
模板的发明是编程史上的一大里程碑,让我们摆脱了烦锁且易出错的字符串拼接,维护性大大提高. 都在JSP,ASP时代,人们已经学会使用include等语句,将多个页面片断拼接成一个页面. 此外,为了将数据 ...
- FreeMarker之根据模板生成Java代码
FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码". 比如Java中三层架构,数 ...
- spark写入ES(动态模板)
使用es-hadoop插件,主要使用elasticsearch-spark-20_2.11-6.2.x.jar 官网:https://www.elastic.co/guide/en/elasticse ...
- SpringBoot整合MyBatisPlus配置动态数据源
目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...
- Logstash动态模板映射收集Nginx的Json格式日志
Logstash传输给ES的数据会自动映射为5索引,5备份,字段都为text的的索引.这样基本上无法进行数据分析.所以必须将Logstash的数据按照既定的格式存储在ES中,这时候就要使用到ES模板技 ...
随机推荐
- 题解【洛谷 P1246 编码】
题目 编码工作常被运用于密文或压缩传输.这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数宇. 字母表中共有 \(26\) 个字母 \(\{\tt a,b,\cdots,z\}\),这些 ...
- 万答#11,MySQL中char与varchar有什么区别
万答#11,MySQL中char与varchar有什么区别 1.实验场景 GreatSQL 8.0.25 InnoDB 2.实验测试 2.1 区别 参数 char varchar 长度是否可变 定长 ...
- FormData 和表单元素(form)的区别
Form 元素 <form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件.字符).下面称之为表单元素或表单. 要向 Web 服务器提交信息,我们必须要 ...
- Find-Vulnerability 自动化探测扫描工具简介
Fvuln 简介 F-vuln(全称:Find-Vulnerability)是一款自动化探测扫描工具,主要适用于日常安全服务.渗透测试人员和RedTeam红队人员使用 它集合的功能包括: 存活IP探测 ...
- 不想当Window的Dialog不是一个好Modal,弹窗翻身记
弹窗是我们熟视无睹的一种交互方式,经常用到,但从没好好想过这种交互行为背后的意义... 弹窗是Windows的灵魂 Windows的灵魂是什么?当然是Window,当方便快捷的多窗口进入人们视野的时候 ...
- 网卡限速工具之WonderShaper
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 什么是WonderShaper 如何安装Wonder ...
- day30-注解
Java注解 1.注解的理解 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包.类.方法.属性.构造器.局部变量等数据信息 和注释一样,注解不影响程序逻辑,但注解可以被 ...
- 【读书笔记】C#高级编程 第七章 运算符和类型强制转换
(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 < ...
- 项目管理构建工具——Maven(基础篇)
项目管理构建工具--Maven(基础篇) 在前面的内容中我们学习了JDBC并且接触到了jar包概念 在后面我们的实际开发中会接触到很多jar包,jar包的导入需要到互联网上进行就会导致操作繁琐 Mav ...
- 一文读懂,硬核 Apache DolphinScheduler3.0 源码解析
点亮 ️ Star · 照亮开源之路 https://github.com/apache/dolphinscheduler 本文目录 1 DolphinScheduler的设计与策略 1.1 分布 ...