2011-07-29 15 views
5

¿Cómo puedo configurar Freemarker para buscar plantillas en varios jarros? Con la primavera.plantillas freemarker en varios jar

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

One war file (para implementar) y jar archive (en dependencias).

One.war

/freemarker/simple.ftl

Two.jar

/freemarker/test.ftl

trabajo.

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

Do not work. No se puede encontrar test.ftl

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

Si la configuración es:

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

One.war

/freemarker/simple.ftl

Two.jar

/freemarker2/test.ftl

trabajo.

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

trabajo.

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

¡Y la pregunta! ¿Cómo se configura freemarker para buscar en varios jar (wars) en la misma ruta (classpath:/freemarker /)?

+0

Hmm, esto es algo que nunca pude hacer yo mismo. Interesado por las respuestas Además, mis archivos '.ftl' están en'/WEB-INF/freemarker/' –

+0

Donde los archivos no son tan importantes. – Alexander

+1

buena pregunta, lástima de su tasa de aceptación. –

Respuesta

7

¡Encontré la solución! Desactive preferFileSystemAccess para cargar siempre a través de 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 (preferFileSystemAccess booleano)

Configure si se prefiere el acceso al sistema de archivos para la carga de la plantilla. El acceso al sistema de archivos permite la detección en caliente de cambios de plantillas.

Si esto está habilitado, FreeMarkerConfigurationFactory intentará resolver el "templateLoaderPath" especificado como recurso de sistema de archivos (que también funcionará para recursos de ruta de clase expandidos y recursos de ServletContext).

El valor predeterminado es "verdadero". Desactívela para cargar siempre a través de SpringTemplateLoader (es decir, como secuencia, sin detección activa de cambios en la plantilla), lo que podría ser necesario si algunas de sus plantillas residen en un directorio de clases expandido mientras que otras residen en archivos jar.

1

Una vez que hice una cosa similar mediante programación:

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 es una clase base para mis servlets reales.

El número 1 establece la ruta de búsqueda de las plantillas a {{WEB-INF/templates}} en el contexto de servlet actual. El número 2 establece una segunda ruta de búsqueda al subpaquete "plantillas".

Puede agregar más rutas de plantilla.

Espero que ayude.

Cuestiones relacionadas