从数据库加载免费标记模板

2022-09-01 15:12:24

我想将我的 FreeMarker 模板存储在一个数据库表中,如下所示:

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

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

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

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


答案 1

我们使用StringTemplateLoader来加载我们从db获得的tempates(正如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输出。


答案 2

有几种方法:

  • 创建 TemplateLoader 的新实现以直接从数据库加载模板,并在加载任何模板之前将其传递给您的配置实例。setTemplateLoader()

  • 使用在应用程序启动时从数据库配置的 StringTemplateLoader。将其添加到配置中,如上所述。

根据提问者的编辑进行编辑,您自己的TemplateLoader实现看起来就像是要走的路。在这里检查Javadoc,它是一个简单的小界面,只有四种方法,它的行为有很好的记录。