2013-03-28 71 views
1

在我的应用程序,所有的freemarker模板是/模板/ FTL /所以应用程序部署期间我打开一个类我称之为扩展FreemarkerManager并有一个方法Freemarker模板装载

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"); 

在只有一个特定的情况下,我需要得到来自完全不同的道路(不是/模板/ FTL模板/)。

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

谢谢

+0

也许只是建立一个没有独立的(或临时)配置特定的目录? – 2013-03-28 08:46:37

+0

我看不到怎么可能实例化2配置,因为我的类需要扩展FreemarkerManager,在那里我需要扩展我已经做了第一次的createConfiguration方法。里面我得到配置conf = super.createConfiguration(servletContext);但我没有看到我怎么能得到相同的servletContext – gospodin 2013-03-28 09:13:50

回答

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

+0

多数民众赞成它的第二次配置。谢谢!! – gospodin 2013-03-28 14:59:58

0

另一个和更优雅的方式(在我看来)这样做的是配置XML中:

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