我有一个freemarker模板(index.ftl),里面有一个include(page1.ftl和page2.ftl):
this is the sample content on index.ftl
<#include "/pages/page1.ftl">
<#include "/pages/page2.ftl">
blablabla contents here
在我的spring环境中,我扩展了类“AbstractTemplateView”并覆盖了“renderMergedTemplateModel”方法,该方法调用了doRender:
protected void doRender(Map<String, Object> model, String viewName, HttpServletResponse response)
throws Exception {
logger.debug("start doRender");
try {
Configuration config = new Configuration();
String templatePath = templateService.getTemplateLocation();
config.setDirectoryForTemplateLoading(new File(templatePath));
Template template = config.getTemplate(viewName);
response.setContentType("text/html; charset=" + template.getEncoding());
PrintWriter out = response.getWriter();
template.process(model, out);
} catch (IOException e) {
String message = format("cannot render template <{0}> due to IOException: {1}", e.getMessage());
logger.error(message, e);
throw new NestedServletException(message, e);
}
}
我的问题是,如何为page1.ftl和page2.ftl单独设置包含目录?可能吗 ? “setDirectoryForTemplateLoading”方法仅设置模板的默认目录。将查找相对于此目录的任何包含。
这个问题的上下文是我将加载include。但如果我找不到包含,它将查找另一个目录。
示例FTL说(index.ftl):
FREEMARKER MAIN
<#include "page1.ftl">
<#include "page2.ftl">
我尝试了多重加载器,它似乎正在处理index.ftl。它会尝试解析到我定义的目录。但是如何让它解决,如page1.ftl和page2.ftl的不同目录路径?可能吗?当其中一个包含不存在时,它会给我错误。
答案 0 :(得分:1)
setDirectoryForTemplateLoading
只是一种将相应的FileTemplateLoader
传递给Configuration#setTemplateLoader
的便捷方法。您可能希望将多个FileTemplateLoader
合并为一个MultiTemplateLoader
并将此模板加载器传递给Configuration#setTemplateLoader
,例如:
import freemarker.cache.*; // template loaders live in this package
...
FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));
FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));
TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2};
MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
cfg.setTemplateLoader(mtl);
(摘自the FreeMarker documentation about loading templates from multiple locations)