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 代码模板即可)。


相关文章
|
7月前
v-for 中的模板引用
v-for 中的模板引用
|
1月前
|
SQL JavaScript 前端开发
模板字符串
模板字符串的这些特性使得 JavaScript 中的字符串处理更加方便、灵活和强大,提高了代码的可读性和可维护性,在各种 JavaScript 应用场景中都得到了广泛的应用。
23 2
|
4月前
|
Python
定义模板文件
【8月更文挑战第6天】定义模板文件。
51 5
|
4月前
|
JavaScript 前端开发
什么是模板字符串?
什么是模板字符串?
108 0
|
7月前
|
Java 数据处理
JSF 中模板(template)标签指令的使用
本文介绍了JSF中模板标签的使用,通过Facelets标签指令创建网页模板。将页面分为header, content和footer三部分,分别用header.xhtml, content.xhtml和footer.xhtml定义。主模板文件通过ui:insert和ui:include将子模块组装在一起,实现页面布局。最后简要提及了JSF标签库的作用和JSTL的相关内容。
73 2
|
安全 JavaScript 前端开发
JavaScript 中的模板字面量与标签模板
在 JavaScript 中,模板字面量(Template Literals)和标签模板(Tagged Templates)是两种用于处理字符串的特殊方式。它们分别提供了更灵活和强大的字符串处理能力,让字符串拼接、格式化和转义变得更加方便。
224 0
|
编译器 C语言 C++
【C++】模板进阶:非类型模板参数&模板的特化&模板分离编译(下)
【C++】模板进阶:非类型模板参数&模板的特化&模板分离编译(下)
|
C语言 C++ 容器
【C++】模板进阶:非类型模板参数&模板的特化&模板分离编译(上)
【C++】模板进阶:非类型模板参数&模板的特化&模板分离编译(上)
|
JSON 自然语言处理 JavaScript
字符串的解读和标签模板
字符串的解读和标签模板
103 0
|
JavaScript 前端开发
一分钟让你学会模板字符串
一分钟让你学会模板字符串
120 0

相关实验场景

更多