java - 从数据库加载 FreeMarker 模板

标签 java templates freemarker

我想将我的 FreeMarker 模板存储在类似于以下内容的数据库表中:

template_name | template_content
---------------------------------
hello         |Hello ${user}
goodbye       |So long ${user}

当收到对具有特定名称的模板的请求时,这应该会导致执行查询,该查询会加载相关的模板内容。然后,应将此模板内容与数据模型(上述示例中的“用户”变量的值)一起传递给 FreeMarker。

但是,FreeMarker API似乎假设每个模板名称对应于文件系统特定目录中的同名文件。有什么方法可以轻松地从数据库而不是文件系统加载我的模板?

编辑: 我应该提到我希望能够在应用程序运行时将模板添加到数据库中,所以我不能简单地在启动时将所有模板加载到新的 StringTemplateLoader (如下所示)。

最佳答案

我们使用 StringTemplateLoader 加载从数据库中获取的模板(正如 Dan Vinton 建议的那样)

这是一个例子:

StringTemplateLoader stringLoader = new StringTemplateLoader();
String firstTemplate = "firstTemplate";
stringLoader.putTemplate(firstTemplate, freemarkerTemplate);
// It's possible to add more than one template (they might include each other)
// String secondTemplate = "<#include \"greetTemplate\"><@greet/> World!";
// stringLoader.putTemplate("greetTemplate", secondTemplate);
Configuration cfg = new Configuration();
cfg.setTemplateLoader(stringLoader);
Template template = cfg.getTemplate(firstTemplate);

编辑 您不必在启动时加载所有模板。每当我们访问模板时,我们都会从数据库中获取它并通过 StringLoader 加载它,并通过调用 template.process() 我们生成(在我们的例子中)XML 输出。

关于java - 从数据库加载 FreeMarker 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/357370/

相关文章:

java - 将邮件包含推送到 Java 程序

c++ - 使用自定义转换运算符向上转换到模板类

c++ - C++中的转发参数

java - 自从更改 SpringBoot 依赖性以来,在空字段上加入时出现 Freemarker 错误

java - 使用 SLF4J 库代替 Apache Log4j 是否还有其他优势?

java - 将框架设置为不可见时,为什么此代码会产生错误?

javascript - 使用 gulp-file-include 从 HTML 模板到文件的相对路径

java - 如何从 Freemarker 模板访问 Java 系统属性?

javascript - 如何将freemarker列表中包含特殊字符的复杂元素解析为javascript数组

java - 在创建之前将 bundle 发送到主/启动器 Activity ?