虽然这是一个老问题,但对于任何遇到相同问题的人,我找到了一种简单的解决方案,无需自定义模板加载器或在启动时加载模板。
假设您的数据库中有动态模板:
数据库:
<p>Hello <b>${params.user}</b>!</p>
您可以创建一个Freemarker文件(ftlh),解释接收到的字符串(content
),并使用interpret生成模板:
dynamic.ftlh:
<#assign inlineTemplate = content?interpret>
<@inlineTemplate />
然后在您的Java代码中,您只需要从数据库获取字符串(就像从数据库检索任何其他数据一样),并使用具有interpret
的文件生成模板:
Java:
String content = getFromDatabase();
Configuration cfg = getConfiguration();
String filePath = "dynamic.ftlh";
Map<String, Object> params = new HashMap<String, Object>();
params.put("user", "World");
Map<String, Object> root = new HashMap<>();
root.put("content", content);
root.put("params", params);
Template template = cfg.getTemplate(filePath);
try (Writer out = new StringWriter()) {
template.process(root, out);
String result = out.toString();
System.out.println(result);
}
(将
getFromDatabase()
和
getConfiguration()
方法更改为您想要从数据库获取动态内容的任何内容以及相应地获取
Freemarker配置对象)
这将打印:
<p>Hello <b>World</b>!</p>
然后,您可以在数据库中更改动态内容或创建其他内容,添加新参数等,而无需创建其他Freemarker文件(ftlh)。