模板替换引擎(支持富文本动态表格)

news2024/11/14 18:49:24

模板替换引擎(支持富文本动态表格)

  • 前言
  • 功能介绍
    • example:
  • 使用方法
  • 函数扩展
    • 系统函数
    • 自定义函数

前言

分享一下自己开源的工具——模板替换引擎

https://github.com/RwTo/template-engine

可以拿来学习设计模式或使用

感兴趣的话,可以给个star

功能介绍

  1. 模板替换

${name} 替换为 rmw

  1. 动态表格生成

在这里插入图片描述
解析替换为
在这里插入图片描述

  1. 自定义函数执行与替换

$Now() 函数执行替换后为 当前时间 2024-09-15 00:10:00

example:

给定这样一个富文本字符串
在这里插入图片描述

$Now(yyyy-MM-dd)

$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)
这种配置是 函数替换

${student.name}
这种配置是 对象字段替换。如果是在表格中,会根据表格格式 动态生成表格

上述模板经过模板引擎的处理后,结果如下
在这里插入图片描述

使用方法

  1. 引入maven依赖
<dependency>
    <groupId>io.github.rwto</groupId>
    <artifactId>template-engine</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 构建动态对象
    使用 @TemplateModel 和 @TemplateParam 构建模板替换参数
@TemplateModel("college")
@AllArgsConstructor
public class College {
    @TemplateParam("name")
    private String name;
    @TemplateParam("grade")
    private String grade;
}


@AllArgsConstructor
@TemplateModel("student")
public class Student {
    @TemplateParam("id")
    private Integer id;
    @TemplateParam("name")
    private String name;
    @TemplateParam("age")
    private Integer age;
    @TemplateParam("subject")
    private String subject;


    public static List<Student> getData(){
        List<Student> list = new ArrayList<>();
        list.add(new Student(1,"rmw",24,"计算机"));
        list.add(new Student(2,"wtt",25,"软件"));
        list.add(new Student(3,"llt",27,"计网"));
        list.add(new Student(4,"zze",34,"管理"));
        return list;
    }
}


@TemplateModel("teacher")
@AllArgsConstructor
public class Teacher {
    @TemplateParam("name")
    private String name;
    @TemplateParam("age")
    private Integer age;
    @TemplateParam("entryDate")
    private String entryTime;

    public static List<Teacher> getData(){
        List<Teacher> list = new ArrayList<>();
        list.add(new Teacher("wzz",44, "2011-09-01 12:00:26"));
        list.add(new Teacher("zgl",45, "2013-02-01 12:30:24"));
        list.add(new Teacher("jjw",37, "2024-04-01 15:10:13"));
        list.add(new Teacher("zxz",34, "2016-09-01 16:43:33"));
        return list;
    }
}

以Teacher 类 为例 经过解析获取的可替换参数为
teacher.name 使用方法:${teacher.name}
teacher.age 使用方法:${teacher.age}
teacher.entryDate 使用方法:${teacher.entryDate}

  1. 构建模板字符串
    以下面的富文本为例:

在这里插入图片描述

对应富文本字符串:


当前时间:$Now(yyyy-MM-dd)
<br>
学院信息:${college.name}, 年级: ${college.grade}

<table border="1" cellspacing="0" cellpadding="8">
        <tr>
            <th colspan="4">学生信息表</th>
        </tr>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>专业</th>
			<th>信息</th>
        </tr>
        <tr>
            <td>${student.name}</td>
            <td>${student.age}</td>
            <td>${student.subject}</td>
			<td>$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)</td>
        </tr>
</table>
	
学院名称:${college.name}
	
<table border="1" cellspacing="0" cellpadding="8">
        <tr>
            <th colspan="3">讲师信息表</th>
        </tr>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
			<th>入职日期</th>
        </tr>
        <tr>
            <td>${teacher.name}</td>
            <td>${teacher.age}</td>
			<td>$DateTimeFormat(${teacher.entryDate},yy-MM-dd)</td>
        </tr>
        <tr>
            <td>李四</td>
            <td>21</td>
			<td>111</td>
        </tr>
    </table>
  1. 执行模板替换
public class TemplateEngineTest {
    public static void main(String[] args){

        String tmpl = "\n" +
                "当前时间:$Now(yyyy-MM-dd)\n" +
                "<br>\n" +
                "学院信息:${college.name}, 年级: ${college.grade}\n" +
                "\n" +
                "<table border=\"1\" cellspacing=\"0\" cellpadding=\"8\">\n" +
                "        <tr>\n" +
                "            <th colspan=\"4\">学生信息表</th>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "            <th>姓名</th>\n" +
                "            <th>年龄</th>\n" +
                "            <th>专业</th>\n" +
                "\t\t\t<th>信息</th>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "            <td>${student.name}</td>\n" +
                "            <td>${student.age}</td>\n" +
                "            <td>${student.subject}</td>\n" +
                "\t\t\t<td>$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)</td>\n" +
                "        </tr>\n" +
                "</table>\n" +
                "\t\n" +
                "学院名称:${college.name}\n" +
                "\t\n" +
                "<table border=\"1\" cellspacing=\"0\" cellpadding=\"8\">\n" +
                "        <tr>\n" +
                "            <th colspan=\"3\">讲师信息表</th>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "            <th>姓名</th>\n" +
                "            <th>年龄</th>\n" +
                "\t\t\t<th>入职日期</th>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "            <td>${teacher.name}</td>\n" +
                "            <td>${teacher.age}</td>\n" +
                "\t\t\t<td>$DateTimeFormat(${teacher.entryDate},yy-MM-dd)</td>\n" +
                "        </tr>\n" +
                "        <tr>\n" +
                "            <td>李四</td>\n" +
                "            <td>21</td>\n" +
                "\t\t\t<td>111</td>\n" +
                "        </tr>\n" +
                "    </table>" +
                "\t\n" +
                "学院名称:${college.name}\n" +
                "\t\n" ;

        List<Student> students = Student.getData();
        List<Teacher> teachers = Teacher.getData();
        College college = new College("计算机学院", "21级");

        TemplateEngine templateEngine = TemplateEngine.builder().build();
        String content = templateEngine.parseTemplate(tmpl)
                .convert(Arrays.asList(college, students, teachers));
        System.out.println(content);
    }
}

替换后的结果为

当前时间:2024-09-14
<br>
学院信息:计算机学院, 年级: 21级

<table border="1" cellspacing="0" cellpadding="8"><tr><th colspan="4">学生信息表</th></tr><tr><th>姓名</th><th>年龄</th><th>专业</th><th>信息</th></tr><tr><td>rmw</td><td>24</td><td>计算机</td><td><a href="http://xxx?id=1"><span style="color: #3484ff;">rmw的信息</span></a></td></tr><tr><td>wtt</td><td>25</td><td>软件</td><td><a href="http://xxx?id=2"><span style="color: #3484ff;">wtt的信息</span></a></td></tr><tr><td>llt</td><td>27</td><td>计网</td><td><a href="http://xxx?id=3"><span style="color: #3484ff;">llt的信息</span></a></td></tr><tr><td>zze</td><td>34</td><td>管理</td><td><a href="http://xxx?id=4"><span style="color: #3484ff;">zze的信息</span></a></td></tr></table>
	
学院名称:计算机学院
	
<table border="1" cellspacing="0" cellpadding="8"><tr><th colspan="3">讲师信息表</th></tr><tr><th>姓名</th><th>年龄</th><th>入职日期</th></tr><tr><td>wzz</td><td>44</td><td>11-09-01</td></tr><tr><td>zgl</td><td>45</td><td>13-02-01</td></tr><tr><td>jjw</td><td>37</td><td>24-04-01</td></tr><tr><td>zxz</td><td>34</td><td>16-09-01</td></tr><tr><td>李四</td><td>21</td><td>111</td></tr></table>	
学院名称:计算机学院

在这里插入图片描述

函数扩展

系统函数

  1. $Now(arg1) 当前时间

arg1 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss

  1. $DateTimeFormat(arg1,arg2) 日期时间格式化

arg1 必填, 代表要转换的日期,格式必须为 yyyy-MM-dd HH:mm:ss
arg2 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss

  1. $HyperLink(arg1,arg2) 超链接

arg1 必填, 代表 链接url
arg2 必填, 代表 <a> 标签的名称
例如
$Hyperlink(http://xxx?id=1,${student.name}的信息)
转换后为 : <a href="http://xxx?id=1"><span style="color: #3484ff;">${student.name}的信息</span></a>

自定义函数

模板函数 类图
在这里插入图片描述
可以实现 TemplateFunc 接口,自定义自己的函数

public class MyFunc extends AbstractTemplateFunc {
    public MyFunc(String funcName) {
        super(funcName);
    }

    @Override
    public String execute(Object... args) {

        return String.join("|", (String[]) args);
    }
}

在构建模板引擎时,添加自定义函数

public class TemplateEngineTest {
    public static void main(String[] args){
        String tmpl = "asdf $MyFunc(1,2,3,4,asd,22)";
        TemplateEngine templateEngine = TemplateEngine.builder()
                //添加自定义函数
                .addFunction("MyFunc",new MyFunc())
                .build();
        String content = templateEngine.parseTemplate(tmpl)
                .convert(new ArrayList<>());
        //输出: asdf 1|2|3|4|asd|22
        System.out.println(content);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程基础概述

文章目录 协议网络协议栈(osi)局域网IPIP和Mac地址端口号TCP和UDP网络字节序 协议 (网络协议的)意义:为了让计算机传输之间将信息正确传输给目标机器 不同系统之间能接入网络是因为定制了一套通用的协议以便支持不同系统间的网络通信 1.网络通信的问题: 将数据可靠的从A传给B a…

AtCoder ABC369 A-D题解

比赛链接:ABC369 省流&#xff1a;A<B<D<C&#xff08;题解是按照该顺序写的&#xff09; Problem A: #include <bist/stdc.h> using namespace std; int main(){int A,B;cin>>A>>B;if(AB)cout<<1<<endl;else if(abs(A-B)%20)cout&l…

织物缺陷检测系统源码分享

织物缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

1405 问题 E: 世界杯

废话 这个题&#xff0c;我估计 22 22 22 年的时候写过一次&#xff0c;当时应该是搞明白了&#xff0c;现在重新写还是不会写&#xff0c;有点无奈 题目 问题 E: 世界杯&#xff1a;现在的 OJ 把题目加到一个活动里面去之后&#xff0c;感觉之后这个链接就访问不了了。题目…

伙房食堂电气安全新挑战:油烟潮湿环境下,如何筑起电气火灾“防火墙”?

近几年&#xff0c;随着我国经济的飞速发展&#xff0c;食堂餐饮也经历了一场变革&#xff0c;越来越多的电器走进了伙房食堂中&#xff0c;实现了电气化&#xff0c;为人们提供了高效便利的饮食服务&#xff0c;但同时也增加了火灾负荷。目前我国非常严重的电气火灾危害&#…

【STM32】DAC数字模拟转换

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 DAC简介 DAC配置 DAC时钟使能 GPIO初始化 DAC配置 DAC使能 读写DAC值 驱动代码 MyDAC.h MyDAC.c main.c 前言 大容量的STM32F101xx和STM32F103xx产品才有DAC外设 大容量…

几种mfc140u.dll常见错误情况,以及mfc140u.dll文件修复的方法

如果你遇到与mfc140u.dll 文件相关的错误&#xff0c;这通常指的是该mfc140u.dll文件可能丢失、损坏或与您的应用程序不兼容。详细分析关于mfc140u.dll文件错误会对系统有什么影响&#xff0c;mfc140u.dll文件处于什么样的位置&#xff1f;以下是几种常见的错误情况及其修复方法…

R语言统计分析——功效分析(作图)

参考资料&#xff1a;R语言实验【第2版】 假设对于相关系数统计显著性检验&#xff0c;我们想计算一系列效应值和功效水平下所需的样本量&#xff0c;此时可用pwr.r.test()函数和for循环来完成任务。 # 加载pwr包 library(pwr) # 设置各效应值 r<-seq(0.1,0.5,0.01) # 计算…

基于JAVA的实验室智慧管理平台的设计与实现

大型管理系统用传统的手工操作方式进行信息管理容易出现数据丢失&#xff0c;统计错误等问题&#xff0c;而且劳动强度高&#xff0c;速度慢&#xff0c;耗费人力&#xff0c;物力。使用计算机可以高效、准确地完成以上工作。因此&#xff0c;用计算机的高速度和自动化来替代手…

蓝牙模块—BLE-CC41-A

1. 蓝牙的特点 蓝牙模块采用的 TI 公司设计的 CC2541芯片&#xff0c;主要面向低功耗蓝牙通信方案&#xff0c;该模块的工作频段为 2.4Ghz&#xff0c;这个频段属于国际通用频段 注意&#xff1a;蓝牙集成了一个状态指示灯&#xff0c;LED灯如果均匀慢速闪烁&#xff0c;就表示…

接口测试从入门到精通项目实战

视频网址&#xff1a;2024最新接口测试从入门到精通项目实战&#xff08;全套接口测试教程&#xff09;_哔哩哔哩_bilibili 接口架构设计分析 http协议详解 JMeter 目录介绍 常用组件 执行接口测试 接口文档&#xff1a;tlias智能学习辅助系统接口文档-V1.0-CSDN博客 实战 前…

HTB-Lame(msf利用)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解 初学者渗透路径 第一个靶机Lame 渗透过程 信息搜集 服务器开放了21FTP端口、22SSH端口、445SMB端口 利用MSF模块 登录主机 工具介绍&#xff1a;Metasploit Framework&#xff08;简称 MSF&#xf…

RK3562/3588系列之6—yolov5模型的部署

RK3562/3588系列之6—yolov5模型的部署 1.yolov5模型训练2.训练好的模型转成onnx格式3.模型从onnx格式转RKNN3.1 onnx2rknn.py3.2 onnx2rknn.py3.3 直接使用rknn.api3.4 rknn_model_zoo中的转换代码3.5 LubanCat-RK系列板卡官方资料4.RK NPU c++推理4.1交叉编译4.2 开发板执行编…

校园失物招领小程序

校园失物招领小程序 weixin167校园失物招领小程序ssm 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 JSP技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系…

清理C盘缓存,如何针对Windows10系统,专业地调整和优化C盘缓存设置

在Windows10系统中&#xff0c;合理地管理C盘&#xff08;通常是系统盘&#xff09;的缓存设置&#xff0c;对于保持系统性能、提升响应速度以及避免磁盘空间不足等问题至关重要。缓存主要涉及到系统文件、临时文件、应用程序缓存等多个方面。下面将详细介绍如何针对Windows10系…

【webpack4系列】webpack进阶用法(三)

文章目录 自动清理构建目录产物PostCSS插件autoprefixer自动补齐CSS3前缀移动端CSS px自动转换成rem静态资源内联多页面应用打包通用方案使用sourcemap提取页面公共资源基础库分离利⽤ SplitChunksPlugin 进⾏公共脚本分离利⽤ SplitChunksPlugin 分离基础包利⽤ SplitChunksPl…

UVA1395 Slim Span(最小生成树)

*原题链接*(洛谷) 非常水的一道题。看见让求最小边权差值的生成树&#xff0c;很容易想到kruskal。 一个暴力的想法是以每条边为最小边跑一遍kruskal&#xff0c;然后统计答案。时间复杂度&#xff0c;再看题中很小的数据范围和3s的时限。最后还真就过了。 不过我天真的想了…

【机器学习】11——矩阵求导

机器学习11——矩阵求导 打公式不太好标注&#xff0c;全图警告&#xff01;&#xff01;&#xff01; 文章目录 机器学习11——矩阵求导1.1标量对向量1.2标量对矩阵2.1向量对标量2.2向量对向量2.3向量对矩阵 1.1标量对向量 1.2标量对矩阵 X是m*n的矩阵&#xff0c;不严谨&am…

代码随想录Day 44|leetcode题目:1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;1143.最长公共子序列解题思路&#xff1a; 题目二&#xff1a; 1035.不相交的线解题思路&#xff1a; 题目三&#xff1a;53. 最大子序和解题思路 题目四&#xff1a;392.判…

【白话树】之 二叉树

快速导航 一、二叉树的基本概念1、 二叉树定义2、常见术语3、基本操作1&#xff09;创建&#xff1a;2&#xff09;插入与删除&#xff1a; 4、常见类型1&#xff09;满二叉树&#xff08;完美二叉树&#xff09;2&#xff09;完全二叉树3&#xff09;完满二叉树4&#xff09;平…