在Java中FreeMarker 模板来定义字符串模板

目录
  • 问题描述
  • 代码实现
  • 问题总结

问题描述

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

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

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

代码实现

  • 导入依赖,这里我是基于 spring-boot 为基础的。
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
  • 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();
        }
    }

}
  • 定义模板,如下所示(下面知识一个示意):
<#list list as item>
    ${item.url} | ${item.name} | ${item.age}
</#list>
  • 使用模板并且返回渲染后的字符串,最终返回字符串。
Map<String, Object> model = new HashMap<>();
model.put("list", new ArrayList())
FreeMarkerUtils.getTplText("a.html", model);

问题总结

  • 我们使用模板的方式可以减少字符串的拼接,提高代码的可维护性。
  • 如果我们系统中代码风格比较统一,我们可以通过这种方式来生成代码(只需要对数据库的 table meta 进行读取,然后再定义 Java 代码模板即可)。

到此这篇关于在Java中FreeMarker 模板来定义字符串模板的文章就介绍到这了,更多相关FreeMarker 定义字符串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java Spring整合Freemarker的详细步骤

    我的開發環境框架:springmvc開發工具:springsource-tool-suite-2.9.0版本:1.6.0_29tomcat版本:apache-tomcat-7.0.26前言:FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等.簡而言之,Freemarker就是在Jave Web開發

  • Java实现用Freemarker完美导出word文档(带图片)

    前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. 准备材料 1.word原件 2.编辑器(推荐Firstobject free XML editor) 实现步骤 1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型Word 2003 XML 文档(*.xml)[这里说一下为什么用

  • Java用freemarker导出word实用示例

    最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 一.模板的制作 先用Word做一个模板,如下图: (注意,上面是有表格的,我设置了边框不可见)然后另存为XML文件,之后用工具打开这个xml文件,有人用firstobject XML Editor感觉还不如notepad++,我这里用notepad++,主要是有高亮显示,和元素自动配对,效果如下: 上面黑色的地方基本是我们之后要替换的地

  • JAVA集成Freemarker生成静态html过程解析

    Springboot 1.引入Freemarker jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 2.配置application.properties ### freemarker spring.freemarker.t

  • Java超级实用的Freemarker工具类

    目录 一.工具类 二.测试 一.工具类 public class FreemarkerUtil {     /**      * 根据模板,利用提供的数据,生成文件      * @param ftlNameWithPath 模板文件      * @param data 数据      * @param aimFileName 最终生成的文件      * @throws IOException      * @throws TemplateException      */     publ

  • 使用Java进行FreeMarker的web模板开发的基础教程

    一.概述 FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写,FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序,虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由FreeMarker 生成页面,通过模板显示准备的数据(如下图) FreeMarker 不是一个 Web 应用框架,而适合作为 Web 应用框架一个组件.FreeMarker 与容器无关,因为它并不知道

  • 在Java中FreeMarker 模板来定义字符串模板

    目录 问题描述 代码实现 问题总结 问题描述 一个业务需求,需要在后端通过代码渲染一个,列表如下图所示(下图只是一个示意): 这个表格的特点就是数据重复比较多,结构简单,我们可以通过 Java 代码直接拼字符串.但是这样的问题就会导致,代码非常的难看.在 Java 代码中混杂着很多样式代码,可读性和可维护性比较差.所以我就 pass 着这个方案. 于是我就想到,通过模板 + 参数的方式来实现,这样可以做到结构和参数的分离,经过比较我选择了通过 FreeMarker 模板来定义结构,最终完成字符串

  • java 中HttpClient传输xml字符串实例详解

    java 中HttpClient传输xml字符串实例详解 介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方式传输到服务端 其中涉及到的技术点有: 1.对象转xml流 2.输出流转输入流 3.httpClient发送二进制流数据 POM文件依赖配置 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifact

  • Java中读取文件转换为字符串的方法

    方式一 /** 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. 当然也是可以读字符串的. */ /* 貌似是说网络环境中比较复杂,每次传过来的字符是定长的,用这种方式?*/ public String readString1() { try { //FileInputStream 用于读取诸如图像数据之类的原始字节流.要读取字符流,请考虑使用 FileReader. FileInputStream inStream=this.openFileInput(FILE_NAME)

  • java中利用栈实现字符串回文算法

    问题 给定一个由多个a和b组成的字符串数组,字符串中有一个特殊的字符X,位于字符串的正中间,例如(aaaabbbbXabaabbbb),如何判定该字符串是否回文 简单算法 定义两个下标分别指向字符串的头和尾,每次比较两个下标位置的值是否相等,如果不相等,那么输入的 字符串不是回文,如果相等,左边的下表加1,右边的下表减1,重复上述步骤直至两个下标都指向字符串的正中间或者确定字符串不是回文 /** * 判断字符串是否是回文 */ public int isPalindrome(String inp

  • 关于Java中String创建的字符串对象内存分配测试问题

    一.创建String对象的两种常用方法比较 举例说明 String str1 = "Java天下第一"; //方法1 String str2 = new String("Java天下第一"); //方法2 System.out.println(str1 == str2); //比较地址,false System.out.println(str1 == str2.intern()); //true 区别 2.1 方法1中,首先会去JVM的常量池里查找是否有存储&quo

  • Java中HashMap与String字符串互转的问题解决

    目录 背景: 原因: 背景: 当我们有需求将HashMap转为Json格式的String时,切记不要使用HashMap的toString()方法,需要使用FastJson/Gson将HashMap转为String.如果使用toString()方法进行转换时,是无法将字符串再转为HashMap的.它只会出现序列化报错: demo代码: HashMap<String, String> dataMap = new HashMap<>(4); dataMap.put("key1&

  • Python的string模块中的Template类字符串模板用法

    string.Template() string.Template()内添加替换的字符, 使用"$"符号, 或 在字符串内, 使用"${}"; 调用时使用string.substitute(dict)函数. 可以通过继承"string.Template", 覆盖变量delimiter(定界符)和idpattern(替换格式), 定制不同形式的模板. 代码: # -*- coding: utf-8 -*- import string templat

  • Java中String类(字符串操作)的10个常见问题和解决方法

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比Stri

  • 详解Java中的数组与字符串相关知识

    Java数组的定义和使用 如果希望保存一组有相同类型的数据,可以使用数组. 数组的定义和内存分配 Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName; type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量.例如: int demoArray[]; int[] demoArray; 这两种形式没有区别,使用效果完全一样,读者可根据自己的编程习惯选择

  • Java中常用的设计模式之模板模式详解

    目录 优点 缺点 使用场景 一.实现方式 1.游戏抽象类 2.LOL游戏类 3.CF游戏类 二.测试 总结 优点 封装不变部分,扩展可变部分. 提取公共代码,便于维护. 行为由父类控制,子类实现. 缺点 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大. 使用场景 1.有多个子类共有的方法,且逻辑相同. 2.重要的.复杂的方法,可以考虑作为模板方法. 一.实现方式 假设一个场景,我们在玩游戏的时候,都需要初始化加载游戏,然后开始游戏,最后结束游戏,这像是一套模板一样的操作

随机推荐