Spring Freemarker单独呈现“包含”

时间:2011-06-27 03:11:31

标签: spring path include freemarker

我有一个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的不同目录路径?可能吗?当其中一个包含不存在时,它会给我错误。

1 个答案:

答案 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