Freemarker模板加载

时间:2013-03-28 08:33:00

标签: java freemarker

在我的应用程序中,所有freemarker模板都在/ templates / ftl / so中,在应用程序部署期间,我加载了一个类,我调用了一个扩展FreemarkerManager并具有方法的类

Configuration configuration = super.createConfiguration(servletContext);
configuration.setDirectoryForTemplateLoading(new File("/templates/ftl/"));

这样,当我需要加载模板文件时,我可以这样做:

    ServletContext servletContext = ServletActionContext.getServletContext();
    Configuration configFreemarker = (Configuration) servletContext
                    .getAttribute("freemarker.Configuration");
    Template template = configFreemarker.getTemplate("pathToMyTemplate");

在一个特定的情况下,我需要获得一个来自完全不同路径的模板(而不是/ templates / ftl /)。

如何在此特定时刻声明第二个目录以进行模板加载而不会破坏调用旧路径的所有现有代码?我可以同时为模板加载提供2个不同的起点吗?

由于

2 个答案:

答案 0 :(得分:7)

您可以使用MultipleTemplateLoader

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"));
ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "");
TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

cfg.setTemplateLoader(mtl);

来源:Freemarker Manual

答案 1 :(得分:0)

另一种更优雅的方式(在我看来)是在config xml:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPaths">
        <value>/path1/ , /path2/</value>
  </property>
</bean>