我是靠谱客的博主 无私蜜粉,最近开发中收集的这篇文章主要介绍【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

写这篇文章主要是考虑到如下问题会困扰大家

  1. java.io.FileNotFoundException: Template xxx.ftl not found.
  2. 如何让模板中支持原生的<#include “common.ftl”>
  3. 如何在编辑ftl文件中变量的时候能够有有效的提示(此处使用的是idea)

解决方案

首先,看下TemplateLoader实现类有哪些
在这里插入图片描述

第一种方案以StringTemplateLoader为例简单介绍,直接贴代码演示

    /**
     * 初始化include模板
     *
     * @param templateContent
     * @param stringTemplateLoader
     */
    public static void initCommonTemplate(String templateContent, StringTemplateLoader stringTemplateLoader) {
        // 按指定模式在字符串查找
        String pattern = "(?<=<#include\s")(.*?)(?="\s*>)";
        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);
        // 现在创建 matcher 对象
        Matcher m = r.matcher(templateContent);
        while (m.find()) {
            String childTemplateName = "";
            String group = m.group();
            if (group.startsWith("/")) {
                childTemplateName = group.substring(1);
            } else {
                childTemplateName = group;
            }
            stringTemplateLoader.putTemplate(childTemplateName, ResourceHelper.getString(group));
        }
    }

    public static void main(String[] args) throws Exception{

        //region 初始化模板过程
        Configuration ftlConifg = new Configuration(Configuration.VERSION_2_3_29);
        String path = "a.ftl";
        //获取文件内容
        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
        String content = new BufferedReader(new InputStreamReader(resourceAsStream, StandardCharsets.UTF_8))
                .lines()
                .collect(Collectors.joining("n"));

        //将其填充到stringTemplateLoader中
        StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
        stringTemplateLoader.putTemplate(path,content);
        //填充content中include的模板
        initCommonTemplate(content,stringTemplateLoader);
        ftlConifg.setTemplateLoader(stringTemplateLoader);
        //endregion

        //region 获取填充数据后的模板
        //读取模板
        Template template = ftlConifg.getTemplate(path, StandardCharsets.UTF_8.toString());

        //填充数据
        Object data = new Object();
        var out = new StringWriter();
        template.process(Map.of("item", data), out);
        String result  = out.toString();
        //endregion

    }

看了上述代码明显看出了其缺陷,第一需要初始化每个模板,第二需要自定义支持原生的include,下面介绍第二种实现方式

第二种方案以ClassTemplateLoader为例简单介绍,直接贴代码演示

    public static void main(String[] args){
        //region 初始化模板过程
        Configuration ftlConifg = new Configuration(Configuration.VERSION_2_3_29);
        ftlConifg.setClassForTemplateLoading(this.getClass(), "/templates");
        //endregion

        //region 获取填充数据后的模板
        //读取模板
        String path = "a.ftl";
        Template template = ftlConifg.getTemplate(path, StandardCharsets.UTF_8.toString());

        //填充数据
        Object data = new Object();
        var out = new StringWriter();
        template.process(Map.of("item", data), out);
        String result  = out.toString();
        //endregion
    }

此处需要注意的是,模板必须与ftlConifg.setClassForTemplateLoading(this.getClass(), “/templates”);中的
this在同一个项目下

此外补充一点(如何在编辑ftl文件中变量的时候能够有有效的提示)
在ftl文件开头加上如下内容,编辑的时候会有代码提示

<#-- @ftlvariable name="item" type="class路径" -->

最后

以上就是无私蜜粉为你收集整理的【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板的全部内容,希望文章能够帮你解决【Spring&Freemarker】Freemarker中如何读取jar中的template且支持原生的include引入其他模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部