【问题标题】:Importing spring.ftl using Spring MVC, Sitemesh, Freemarker使用 Spring MVC、Sitemesh、Freemarker 导入 spring.ftl
【发布时间】:2012-01-17 01:01:46
【问题描述】:

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

我已经使用基于Ted Young's configuration example 的 Sitemesh 和 Freemarker 配置了 Spring MVC 应用程序。根据Spring MVC/Freemarker 集成参考,必须导入 spring.ftl 宏才能通过 将支持模型绑定到视图。但是,这样做:

<#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 添加到构建路径),但似乎没有成功。

谢谢!

【问题讨论】:

    标签: spring-mvc freemarker sitemesh


    【解决方案1】:

    问题是 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" 和常规 jar 文件从 src/resources/templates 加载 war 文件中的 .ftl 模板。 如果你想在 freemarker 中使用安全标签,重点是这两行:

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

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

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

    有了它,您可以在 freemarker 模板中使用所有 spring 功能。

    【讨论】:

      【解决方案2】:

      我喜欢默认包含的 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;
      }
      

      【讨论】:

        【解决方案3】:
        <#import "spring.ftl" as spring/>
        

        没有/

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 2013-07-21
        • 2011-07-15
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        相关资源
        最近更新 更多