美文网首页
Freemarker 加载字符串模板

Freemarker 加载字符串模板

作者: else05 | 来源:发表于2017-08-30 15:03 被阅读253次

    平时使用模板都是加载模板文件,这次处理的文件是保存在数据库的字符串。
    项目使用的是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. 设置加载器为字符加载器,意味着就不能使用文件的方式读取模板了 !!!!

    相关文章

      网友评论

          本文标题:Freemarker 加载字符串模板

          本文链接:https://www.haomeiwen.com/subject/ltptjxtx.html