2011-12-09 32 views
5

Làm cách nào tôi có thể nhập macro spring.ftl vào trang mẫu Freemarker bằng cách sử dụng Spring MVC, Sitemesh và Freemarker?Nhập spring.ftl bằng Spring MVC, Sitemesh, Freemarker

Tôi đã định cấu hình ứng dụng Spring MVC bằng Sitemesh và Freemarker dựa trên Ted Young's configuration example. Theo tham chiếu tích hợp Spring MVC/Freemarker, cần nhập macro spring.ftl để liên kết mô hình sao lưu với chế độ xem qua < @ spring.bind "command.name" />. Tuy nhiên, cách làm này:

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

Kết quả trong ngoại lệ này:

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, nhưng tôi chưa tìm ra giải pháp trong google đất. Tôi cũng đã cố gắng sử dụng this technique (nén spring.ftl, đặt nó trong META-INF/lib và thêm mã zip vào đường dẫn xây dựng), nhưng dường như nó không hoạt động.

Cảm ơn!

Trả lời

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

Without /

+0

Thật sao? [Tài liệu về mùa xuân] (http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html) nói để sử dụng '<#import" /spring.ftl " như spring /> ' – Raedwald

1

Vấn đề là mùa xuân mà không biết nơi nào để chăm sóc các tập tin spring.ftl: Đây là cấu hình tùy chỉnh của tôi cho một dự án MVC sử dụng 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; 
    } 
} 

Đầu tiên 2 trình tải cho phép tải các mẫu .ftl trong các tệp war từ "/ WEB-INF/ftl" và từ các tệp jar thông thường từ src/resources/templates. Nếu bạn muốn sử dụng thẻ an ninh trong Freemarker các escense là này hai dòng:

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

baseMvcTplLoader loader để có được những spring.ftl từ org.springframework.web.servlet.view.freemarker. Tôi khuyên bạn nên khám phá các mẫu ftl trong một số example project hoặc documentation để có manh mối về cách hoạt động của spring.ftl.

Cấu hình của placeholder không liên quan đến cấu hình Freemarker , nhưng nó rất hữu ích cho tiêm các giá trị trong các biến từ src/resources/application.properties bằng cách sử dụng các chú thích @Value .

Với điều này bạn có thể sử dụng tất cả các mùa xuân điện trong Freemarker mẫu.

0

Tôi thích spring.ftl của tôi được bao gồm theo mặc định mà không phải thêm nó theo cách thủ công trong mỗi chế độ xem. Trong cấu hình của bạn.

Xác định freemarkerConfigurer của bạn như vậy.

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