FreeMarker 模板来定义字符串模板

简介: FreeMarker 模板来定义字符串模板

问题描述


  1. 一个业务需求,需要在后端通过代码渲染一个,列表如下图所示(下图只是一个示意):


image.png


这个表格的特点就是数据重复比较多,结构简单,我们可以通过 Java 代码直接拼字符串。但是这样的问题就会导致,代码非常的难看。在 Java 代码中混杂着很多样式代码,可读性和可维护性比较差。所以我就 pass 着这个方案。


于是我就想到,通过模板 + 参数的方式来实现,这样可以做到结构和参数的分离,经过比较我选择了通过  FreeMarker 模板来定义结构,最终完成字符串模板的定义。


代码实现


  1. 导入依赖,这里我是基于 spring-boot 为基础的。


implementation 'org.springframework.boot:spring-boot-starter-freemarker'


  1. FreeMarker 工具方法,主要是实现模板文件的读取和渲染。


@Slf4j
public class FreeMarkerUtils {
    static Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
    static {
        cfg.setEncoding(Locale.ENGLISH, "utf-8");
        cfg.setTemplateLoader(new SpringTemplateLoader(new DefaultResourceLoader(),"templates/"));
    }
    /**
     * 获取模板
     *
     * @param templateName
     * @return
     */
    public static Template getTpl(String templateName){
        try {
            Template template = cfg.getTemplate(templateName);
            return template;
        } catch (Exception e) {
            log.error("获取模板失败 {}",templateName,e);
            return null;
        }
    }
    /**
     * 获取模板写入后的内容
     *
     * @param templateName
     * @param model
     * @return
     */
    public static Optional<String> getTplText(String templateName, Map<String, Object> model){
        try {
            Template template = cfg.getTemplate(templateName);
            String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
            return Optional.ofNullable(text);
        } catch (Exception e) {
            log.error("获取模板内容失败 {}",templateName,e);
            return Optional.empty();
        }
    }
}


  1. 定义模板,如下所示(下面知识一个示意):


<#list list as item>
    ${item.url} | ${item.name} | ${item.age}
</#list>


  1. 使用模板并且返回渲染后的字符串,最终返回字符串。


Map<String, Object> model = new HashMap<>();
model.put("list", new ArrayList())
FreeMarkerUtils.getTplText("a.html", model);


问题总结


  1. 我们使用模板的方式可以减少字符串的拼接,提高代码的可维护性。


  1. 如果我们系统中代码风格比较统一,我们可以通过这种方式来生成代码(只需要对数据库的 table meta 进行读取,然后再定义 Java 代码模板即可)。


相关文章
|
数据采集 Python
使用Python采集京东商品评论并保存至本地
使用Python采集京东商品评论并保存至本地
|
监控 Java API
一万了解 Gateway 知识点
一万了解 Gateway 知识点
314 0
|
4月前
|
前端开发 数据可视化 JavaScript
惊喜! Github 10k+ star 的国产流程图框架,LogicFlow 能解你的图编辑痛点?
LogicFlow 是一款高效、灵活的流程图编辑框架,支持可视化渲染、自定义节点、插件扩展及前端执行。适用于审批流、ER 图、低代码平台等多种场景,具备清晰架构与活跃社区,助力开发者快速实现专业流程图编辑与执行。
241 1
|
10月前
|
SQL Java 关系型数据库
【📕分布式锁通关指南 01】从解决库存超卖开始加锁的初体验
本文通过电商场景中的库存超卖问题,深入探讨了JVM锁、MySQL悲观锁和乐观锁的实现及其局限性。首先介绍了单次访问下库存扣减逻辑的正常运行,但在高并发场景下出现了超卖问题。接着分析了JVM锁在多例模式、事务模式和集群模式下的失效情况,并提出了使用数据库锁机制(如悲观锁和乐观锁)来解决并发问题。 悲观锁通过`update`语句或`select for update`实现,能有效防止超卖,但存在锁范围过大、性能差等问题。乐观锁则通过版本号或时间戳实现,适合读多写少的场景,但也面临高并发写操作性能低和ABA问题。 最终,文章强调没有完美的方案,只有根据具体业务场景选择合适的锁机制。
336 12
【📕分布式锁通关指南 01】从解决库存超卖开始加锁的初体验
|
消息中间件 存储 开发者
实现AMQP的高效消息传递机制
【8月更文第28天】高级消息队列协议 (AMQP) 是一个为消息中间件设计的开放标准应用层协议。它为消息传递系统提供了标准化的方法,从而确保了高性能和可靠性。本文将详细介绍AMQP中的一些关键特性,并通过示例代码展示如何利用这些特性。
372 2
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
存储 JavaScript 测试技术
redux 为什么要把 reducer 设计成纯函数
Redux 中的 Reducer 被设计为纯函数,以确保其可预测性和可测试性。纯函数仅依赖输入参数,无副作用,便于调试和维护,支持数据流的清晰追踪,利于状态管理。
|
开发工具 git
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
901 0
|
Rust JavaScript 安全
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀
|
JSON Java API
SpringBoot集成Swagger2自动生成API接口文档
SpringBoot集成Swagger2自动生成API接口文档
416 0