几个罐子里的freemarker模板

时间:2011-07-29 08:50:24

标签: java spring 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在同一路径中的几个jar(war)中搜索(classpath:/ freemarker /)?

2 个答案:

答案 0 :(得分:10)

我找到了解决方案!关闭 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>
  

public void setPreferFileSystemAccess (boolean preferFileSystemAccess)

     

设置是否更喜欢文件系统访问以进行模板加载。文件系统访问可以热检测模板更改。

     

如果启用此选项,FreeMarkerConfigurationFactory将尝试将指定的“templateLoaderPath”解析为文件系统资源(这也适用于扩展的类路径资源和ServletContext资源)。

     

默认为“true”。将其关闭以始终通过SpringTemplateLoader加载(即作为流,无需热模板更改检测),如果某些模板驻留在扩展类目录中而其他模板驻留在jar文件中,则可能需要这样做。

答案 1 :(得分: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的基类。

Number 1将模板的搜索路径设置为当前servlet上下文中的{{WEB-INF / templates}}。 Number 2设置了子包“templates”的第二个搜索路径。

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

希望它有所帮助。