Рендеринг Spring Freemarker включает индивидуально

У меня есть шаблон 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

В моей весенней среде я расширил класс «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. Но если я не могу найти include , он будет искать другой каталог.

Пример FTL говорит (index.ftl):

 FREEMARKER MAIN

 <#include "page1.ftl">
 <#include "page2.ftl"> 

Я попробовал мультилоадер, и он, кажется, работает с index.ftl. он попытается разрешить каталоги, которые я определяю. но как я могу разрешить, скажем, разные пути к каталогам для page1.ftl и page2.ftl? Является ли это возможным? Это дает мне ошибки, когда одно из включений отсутствует.


person Arlandria    schedule 27.06.2011    source источник


Ответы (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);

(взято из документации FreeMarker о загрузке шаблонов из нескольких мест)

person Chaquotay    schedule 27.06.2011