【问题标题】:Spring Freemarker render "includes" individuallySpring Freemarker 单独渲染“包含”
【发布时间】:2011-09-23 05:08:03
【问题描述】:

我有一个 freemarker 模板 (index.ftl),其中包含一个包含 (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"> 

我尝试了 multiloader,它似乎正在处理 index.ftl。它将尝试解析到我定义的目录。但是我怎样才能让它解决说 page1.ftl 和 page2.ftl 的不同目录路径?可能吗?当其中一个包含不存在时,它会给我错误。

【问题讨论】:

    标签: spring path include freemarker


    【解决方案1】:

    setDirectoryForTemplateLoading 只是一种将相应的FileTemplateLoader 传递给Configuration#setTemplateLoader 的便捷方法。您可能希望将多个FileTemplateLoaders 合并为一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多