2011-12-09 22 views
5

Spring.ftl makrolarını Spring MVC, Sitemesh ve Freemarker kullanarak Freemarker şablon sayfasına nasıl alabilirim?Spring MVC, Sitemesh, Freemarker kullanarak spring.ftl içe aktarılıyor

Ted Young's configuration example'a dayanarak Sitemesh ve Freemarker'ı kullanarak bir Spring MVC uygulaması yapılandırdım. Spring MVC/Freemarker tümleştirme referansına göre, backing modelini < @ spring.bind "command.name" /> aracılığıyla bağlamak için spring.ftl makrolarını içe aktarmak gerekir. Bu istisna içinde

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

Sonuçlar:: Ancak bu işlemin

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 ama google topraklarda bir çözüm bulmak için henüz ettik. Ayrıca this technique'u kullanmaya başladım (spring.ftl dosyasını zıvanalayarak, META-INF/lib dosyasına yerleştirerek ve zip'i yapı yoluna ekleyerek), ama işe yaramadı.

Teşekkürler! Bu

/** 
* 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; 
    } 
} 

ilk 2 Önyükleme

kullanarak bir MVC proje için benim özel yapılandırma:

cevap

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

/

+0

Gerçekten mi? [Spring dokümantasyonunun kendisi] (http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html) '<#import '/spring.ftl' ifadesini kullanmaktadır. bahar /> – Raedwald

1

olmadan sorunun O bahar nerede spring.ftl dosyaya bakmak bilmiyorum olduğunu yükleyiciler, war dosyalarındaki "/ WEB-INF/ftl" dosyalarından .ftl şablonlarını ve dosyalarındandosyalarına yükleme yapabilir 10

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

Ve org.springframework.web.servlet.view.freemarker den spring.ftl almak için baseMvcTplLoader yükleyici: Eğer freemarker escense güvenlik etiketleri kullanmak istiyorsanız bu iki çizgilerdir. Bazı example project veya documentation'da ftl şablonlarını araştırmayı, spring.ftl'un nasıl çalıştığına dair bir ipucu vermeyi öneririm.

tutucu konfigürasyonu freemarker yapılandırma ile ilgili, ancak @Value ek açıklama kullanılarak src/resources/application.properties gelen değişkenlerin değerleri püskürtmek için çok faydalı değildir. Eğer freemarker şablonları içinde tüm bahar gücünü kullanabilir Bununla

.

0

Yayımları, her görünümde el ile eklemeniz gerekmeden varsayılan olarak dahil etmeyi seviyorum. Yapılandırmanızda.

FreemarkerConfigurer öğenizi bu şekilde tanımlayın.

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