欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Freemarker 加载字符串模板

程序员文章站 2022-07-14 09:52:48
...

平时使用模板都是加载模板文件,这次处理的文件是保存在数据库的字符串。
项目使用的是spring-boot和freemarker整合

  • 环境

JDK  : 1.8
框架 : Spring boot
模板 : Freemarker
  • 整合freemarker

<!--整合freemarker-->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  • 使用字符串作模板

  1. 在类中注入模板配置
@Autowired
@Qualifier("freeMarkerConfiguration")
private Configuration       freemarkerConf;
  1. 核心代码
String templateContent="这是一个字符串加载的模板  ${name}";
// 新建一个字符串的模板加载器
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
// 设置模板 ,其中
stringTemplateLoader.putTemplate("myTemplate", templateContent);
freemarkerConf.setTemplateLoader(stringTemplateLoader);

freemarkerConf.clearTemplateCache();
Template   template = freemarkerConf.getTemplate("myTemplate", "utf-8");

  • 实际应用

    private Template createTemplate(String name, String templateContent) throws IOException {
        Template template = freemarkerConf.getTemplate(name, "utf-8");

        if (template != null) {
            return template;
        }
        synchronized (this){ // 以下操作不是线程安全,要加上同步
            // 获取模板加载器
            TemplateLoader templateLoader = freemarkerConf.getTemplateLoader();
            if(templateLoader != null && templateLoader instanceof StringTemplateLoader){
                // 如果加载器已经是字符串加载器,则在原来的加载器上put一个新的模板
                ((StringTemplateLoader) templateLoader).putTemplate(name, templateContent);
                freemarkerConf.setTemplateLoader(templateLoader);
            }else{
                // 如果原来的模板加载器不是字符串的(默认是文件加载器),则新建
                StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
                stringTemplateLoader.putTemplate(name, templateContent);
                freemarkerConf.setTemplateLoader(stringTemplateLoader);
            }
            // 这里要清一下缓存,不然下面可能会获取不到模板
            freemarkerConf.clearTemplateCache();
            template = freemarkerConf.getTemplate(name, "utf-8");

            return template;
        }
    }

注意:

1. 设置好模板后要清一下缓存,否则你新保存的模板可能会获取不到!!!

2. 设置加载器为字符加载器,意味着就不能使用文件的方式读取模板了 !!!!