freemarker模板ftl标记在另一个ftl标记中

f1tvaqid  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(305)

我正在使用freemarker模板作为java邮件服务的模板文件。我正在尝试制作通用的ftl模板,并将内容存储在数据库中。
这是我的示例java模型,我用它绑定数据

model.put("invref",dbModel.getinvoiceRefNumber());
        model.put("myContent", "<p>Hi Your invocie ref number is ${invref}</p>");

我不想为每种电子邮件类型创建新的ftl文件,而是希望在运行时生成内容。但是它没有绑定内部ftl标签,我得到的输出是

Hi Your invocie ref number is ${invref}

我试着用下面的组合来显示html,但还是没有成功

${invref?html}

[#noescape]${invref?html}[/#noescape]

我要怎么做?

slhcrj9b

slhcrj9b1#

我认为“不具约束力”是指 ${invref} 未在输出中解析。您可以像下面这样解决这个问题,但是要注意安全性:可以将值放入db的人可以让您执行任意freemarker模板。看到了吗https://freemarker.apache.org/docs/app_faq.html#faq_template_uploading_security 更多。所以如果你的情况可以,那么:

[@myContent?interpret /]

请注意,对于大多数其他人来说 <@myContent?interpret /> ,但您使用的是方括号语法。
还有,我看到你想用 ?html . 这是对字符串的html转义,因此,它与解释ftl无关。另外,如果您生成html电子邮件,请考虑使用自动转义(我知道您不使用自动转义,因为 #noescape 不允许)。

roqulrg3

roqulrg32#

我就是这样做到的。
将公共页眉和页脚内容放置到静态ftl文件中。
使用utlitly classfreemarkertemplateutils将静态文件的内容作为字符串加载

Template header = configuration.getTemplate("header.ftl");
   String headerTemplateAsString =  
   FreeMarkerTemplateUtils.processTemplateIntoString(header, Collections.emptyMap());

stringtemplateloader允许我们加载多个模板字符串,包括主内容之后和之前的页眉和页脚内容(在我的示例中)

Template header = configuration.getTemplate("header.ftl");
    String headerTemplateAsString =  
          FreeMarkerTemplateUtils.processTemplateIntoString(header, Collections.emptyMap());

    StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
    stringTemplateLoader.putTemplate("header",headerTemplateAsString);
    stringTemplateLoader.putTemplate("createdTemplate","" +
           "<#include \"header\">"
     + emailContentFromDB );
    configuration.setTemplateLoader(stringTemplateLoader);
    Template template = configuration.getTemplate("createdTemplate");
    String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
    helper.setText(html, true);

相关问题