使用Spring MVC,Sitemesh,Freemarker导入spring.ftl

时间:2011-12-09 19:14:48

标签: spring-mvc freemarker sitemesh

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

我使用基于Ted Young's configuration example的Sitemesh和Freemarker配置了一个Spring MVC应用程序。根据{{​​3}}集成引用,有必要导入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

Spring MVC/Freemarker,但我还没有找到谷歌的解决方案。我还尝试使用Others have experienced this issue(压缩spring.ftl,将其放在META-INF / lib中,并将zip添加到构建路径中),但它似乎没有用完。

谢谢!

3 个答案:

答案 0 :(得分:3)

问题是spring不知道在哪里查看spring.ftl文件: 这是我使用Boot

的MVC项目的自定义配置
/**
 * 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个加载器允许从“/ WEB-INF / ftl”的.ftl个文件和war的常规jar文件中加载src/resources/templates个模板。 如果你想在freemarker中使用安全标签,那么escense就是这两行:

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

baseMvcTplLoader加载程序从spring.ftl获取org.springframework.web.servlet.view.freemarker。我建议在某些example projectdocumentation中探索ftl模板,以了解spring.ftl的工作原理。

  

占位符的配置与freemarker无关   配置,但它对于在变量中注入值非常有用   使用src/resources/application.properties@Value开始   注释

使用此功能,您可以使用 freemarker 模板中的所有 spring 功能。

答案 1 :(得分:0)

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

定义你的freemarkerConfigurer。

{{1}}

答案 2 :(得分:-2)

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

没有/