2011-12-09 132 views
5

如何使用Spring MVC,Sitemesh和Freemarker将spring.ftl宏导入Freemarker模板页面?使用Spring MVC,Sitemesh,Freemarker导入spring.ftl

我已经使用Sitemesh和Freemarker基于Ted Young's configuration example配置了Spring MVC应用程序。根据Spring MVC/Freemarker集成参考,有必要导入spring.ftl宏,以便通过< @ spring.bind“command.name”/>将支持模型绑定到视图。但是,这样做:

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

结果此异常:

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,但我还没有找到在谷歌土地的解决方案。我也尝试使用this technique(将spring.ftl压缩,放置在META-INF/lib中,并将zip添加到构建路径中),但似乎没有成效。

谢谢!

回答

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

没有/

+0

真的吗? [Spring文档本身](http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html)表示要使用'<#import“/spring.ftl”作为spring />' – Raedwald

1

的问题是,春天不知道在哪里spring.ftl文件后,看: 这是使用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; 
    } 
} 

第2的MVC项目我的自定义配置加载器允许从“/ WEB-INF/ftl”加载.ftl模板和从加载jar文件10。 如果你想在freemarker中的escense使用安全标签这两条线:

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

而且baseMvcTplLoader装载机从org.springframework.web.servlet.view.freemarker得到spring.ftl。我建议在某些example projectdocumentation中探索ftl模板,以了解spring.ftl的工作方式。

占位符的结构不相关的的freemarker 配置,但其用于通过使用@Value 注释从src/resources/application.properties注入在变量值 非常有用的。

有了这个,你可以使用freemarker的模板内的所有春天动力。

0

我喜欢默认包含我的spring.ftl,而不必在每个视图中手动添加它。在你的配置中。

定义您的freemarkerConfigurer。

@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; 
} 
相关问题