2011-12-09 13 views
5

¿Cómo puedo importar las macros de spring.ftl en una página de plantilla de Freemarker con Spring MVC, Sitemesh y Freemarker?Importación de spring.ftl con Spring MVC, Sitemesh, Freemarker

He configurado una aplicación Spring MVC usando Sitemesh y Freemarker basado en Ted Young's configuration example. Según la referencia de integración Spring MVC/Freemarker, es necesario importar las macros spring.ftl a fin de obligar el modelo de respaldo a la vista a través de < @ spring.bind "command.name" />. Sin embargo, hacer esto:

<#import "/spring.ftl" as spring> 
<@spring.bind "command.user"/> 

Los resultados en esta excepción:

org.springframework.web.util.NestedServletException: 
Request processing failed; nested exception is freemarker. 
template.TemplateException: Error reading imported file spring.ftl 

Others have experienced this issue, pero todavía tengo que encontrar una solución en google tierra. También he intentado usar this technique (cerrando la cremallera de spring.ftl, colocándolo en META-INF/lib, y la adición de la cremallera a la trayectoria de la estructura), pero no parecía funcionar.

Gracias!

Respuesta

-2
<#import "spring.ftl" as spring/> 

Sin /

+0

¿De verdad? El [Documentación primavera en sí] (http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html) dice que use ' ' – Raedwald

1

El problema es que la primavera no saben dónde buscar después de que el archivo spring.ftl: Esta es mi configuración personalizada para un proyecto de MVC mediante Boot

/** 
* Otras configuraciones de la aplicaciones web, incluyendo algunas definidas en 
* xml. Usar @ImportResource("classpath:/extra-config.xml") en caso de quererse 
* importar configuracion en xml 
*/ 
@Configuration 
@PropertySource("classpath:application.properties") 
public class WebAppConfig 
{ 
    @Autowired 
    private ServletContext context; 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     PropertySourcesPlaceholderConfigurer placeHolderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
     return placeHolderConfigurer; 
    } 

    @Bean 
    public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException 
    { 
     FreeMarkerConfigurer configurer = new FreeMarkerConfigurer() 
     { 

      @Override 
      protected void postProcessConfiguration(freemarker.template.Configuration config) throws IOException, TemplateException 
      { 
       WebappTemplateLoader WebAppTplLoader = new WebappTemplateLoader(context, "/WEB-INF/ftl"); 
       ClassTemplateLoader classTplLoader = new ClassTemplateLoader(context.getClassLoader(), "/templates"); 
       ClassTemplateLoader baseMvcTplLoader = new ClassTemplateLoader(FreeMarkerConfigurer.class, ""); 
       MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] 
       { 
        WebAppTplLoader, 
        classTplLoader, 
        baseMvcTplLoader 
       }); 
       config.setTemplateLoader(mtl); 
      } 
     }; 
     configurer.setDefaultEncoding("UTF-8"); 
     configurer.setPreferFileSystemAccess(false); 
     return configurer; 
    } 

    @Bean 
    public FreeMarkerViewResolver viewResolver() 
    { 
     FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); 
     viewResolver.setExposeSpringMacroHelpers(true); 
     viewResolver.setExposeRequestAttributes(true); 
     viewResolver.setPrefix(""); 
     viewResolver.setSuffix(".ftl"); 
     viewResolver.setContentType("text/html;charset=UTF-8"); 
     return viewResolver; 
    } 
} 

El primer 2 cargadores permiten cargar .ftl plantillas en war archivos de "/ WEB-INF/ftl" y de jar archivos regulares desde src/resources/templates. Si desea utilizar las etiquetas de seguridad en la FreeMarker escense son estas dos líneas:

  viewResolver.setExposeSpringMacroHelpers(true); 
     viewResolver.setExposeRequestAttributes(true); 

y de la baseMvcTplLoader cargador para obtener el spring.ftl de org.springframework.web.servlet.view.freemarker. Aconsejo a explorar las plantillas FTL en algunos example project o documentation tener una idea de cómo spring.ftl obras.

La configuración del marcador de posición no está relacionado con la configuración FreeMarker , sin embargo, su muy útil para los valores en las variables de la inyección de de src/resources/application.properties mediante el uso de la anotación @Value .

Con ello se puede utilizar toda la potencia deprimavera dentro FreeMarker plantillas.

0

Me gusta mi spring.ftl incluido por defecto sin tener que agregarlo manualmente en cada vista. En tu configuración

definir su freemarkerConfigurer como tal.

@Bean(name = "freemarkerConfig") 
public FreeMarkerConfigurer freemarkerConfig() { 
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); 
    configurer.setTemplateLoaderPath("/WEB-INF/views/"); 
    Map<String, Object> map = new HashMap<>(); 
    map.put("xml_escape", new XmlEscape()); 
    configurer.setFreemarkerVariables(map) 
    def settings = new Properties() 
    settings['auto_import'] = 'spring.ftl as spring, layout/application.ftl as l' 
    configurer.setFreemarkerSettings(settings) 
    println "returning freemarker config" 
    return configurer; 
}