2011-12-09 13 views
5

Come posso importare le macro spring.ftl in una pagina modello Freemarker utilizzando Spring MVC, SiteMesh, e Freemarker?Importazione spring.ftl utilizzando Spring MVC, SiteMesh, Freemarker

Ho configurato un'applicazione Spring MVC utilizzando SiteMesh e Freemarker sulla base di Ted Young's configuration example. In base al riferimento di integrazione Spring MVC/Freemarker, è necessario importare i macro spring.ftl per associare il modello di supporto alla vista tramite < @ spring.bind "command.name" />. Tuttavia, questa operazione:

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

I risultati in questa eccezione:

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, ma non ho ancora trovato una soluzione in google terreno. Ho anche provato a utilizzare this technique (zippando spring.ftl, inserendolo in META-INF/lib e aggiungendo lo zip al percorso di build), ma non sembrava funzionare.

Grazie!

risposta

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

Senza /

+0

Davvero? La [documentazione Spring stessa] (http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html) dice di usare '<#import" /spring.ftl " come primavera /> ' – Raedwald

1

Il problema è che la primavera non so dove andare a cercare dopo che il file spring.ftl: Questa è la mia configurazione personalizzata per un progetto MVC utilizzando 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; 
    } 
} 

Il primo 2 caricatori consentono di caricare i modelli in .ftlwar file da "/ WEB-INF/FTL" e da normali file jar da src/resources/templates. Se si desidera utilizzare etichette di sicurezza in freemarker l'escense sono queste due linee:

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

E il baseMvcTplLoader loader per ottenere il spring.ftl da org.springframework.web.servlet.view.freemarker. Consiglio di esplorare i modelli ftl in alcuni example project o documentation per avere un'idea di come funziona spring.ftl.

La configurazione del segnaposto non è relativo alla configurazione freemarker , ma la sua molto utile per iniettare valori delle variabili da src/resources/application.properties usando l'annotazione @Value .

Con questo è possibile utilizzare tutte le primavera potere all'interno freemarker modelli.

0

Mi piace il mio spring.ftl incluso di default senza dover aggiungere manualmente all'interno di ogni punto di vista. Nella tua configurazione.

definire il vostro freemarkerConfigurer in quanto tale.

@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; 
}