2011-07-29 19 views
5

如何配置freemarker以在多個罐子中搜索模板?隨着春天。幾個罐子中的freemarker模板

<!-- freemarker config --> 
<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPaths" value="classpath:/freemarker/" /> 
</bean> 

一個war文件(要部署)和jar文件(依賴項)。

One.war

/freemarker/simple.ftl

Two.jar

/freemarker/test.ftl

工作。

ModelAndView mav = new ModelAndView(); 
mav.setViewName("simple"); 

不工作。找不到test.ftl

ModelAndView mav = new ModelAndView(); 
mav.setViewName("test"); 

如果設置爲:

<property name="templateLoaderPaths" value="classpath:/freemarker/,classpath:/freemarker2/" /> 

One.war

/freemarker/simple.ftl

Two.jar

/freemarker2/test.ftl

工作。

ModelAndView mav = new ModelAndView(); 
mav.setViewName("simple"); 

工作。

ModelAndView mav = new ModelAndView(); 
mav.setViewName("test"); 

問題!如何配置freemarker在相同路徑(classpath:/ freemarker /)中的幾個罐子(戰爭)中搜索?

+0

嗯,這是我從來沒有工作過的東西。有興趣回覆。 另外,我的'.ftl'文件位於'/ WEB-INF/freemarker /' –

+0

文件不是那麼重要。 – Alexander

+1

很好的問題,可惜你的接受率。 –

回答

7

我找到解決方案!關閉preferFileSystemAccess始終通過SpringTemplateLoader加載。

<!-- freemarker config --> 
<bean id="freemarkerConfig" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPaths" value="classpath:/freemarker/" /> 
    <property name="preferFileSystemAccess" value="false" /> 
</bean> 

公共無效setPreferFileSystemAccess(布爾preferFileSystemAccess)

設置是否喜歡模板加載文件系統的訪問。文件系統訪問使模板更改的熱檢測成爲可能。

如果啓用此功能,FreeMarkerConfigurationFactory會嘗試將指定的「templateLoaderPath」解析爲文件系統資源(它也適用於擴展類路徑資源和ServletContext資源)。

默認爲「true」。關閉此功能始終通過SpringTemplateLoader加載(即作爲流,沒有熱檢測到模板更改),如果某些模板駐留在展開的類目錄中,而其他模板駐留在jar文件中,則可能需要該模板。

1

一旦我這樣編程了類似的事情:

public class ControllerServlet extends HttpServlet { 
    private Configuration cfg; 
    public void init() { 
    cfg = new Configuration(); 
    // 1 
    WebappTemplateLoader wtl = new WebappTemplateLoader(getServletContext(), "WEB-INF/templates"); 
    // 2 
    ClassTemplateLoader ctl = new ClassTemplateLoader(ControllerServlet.class, "templates"); 
    MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {wtl, ctl}); 
    cfg.setTemplateLoader(mtl); 
    //.... 
} 
} 

ControllerServlet中是我真正的servlet的一個基類。

第1號將模板的搜索路徑設置爲當前servlet上下文中的{{WEB-INF/templates}}。 2號設置子包「模板」的第二個搜索路徑。

您可以添加更多模板路徑。

希望它有幫助。