2011-12-09 10 views
5

Spring MVC、Sitemesh、Freemarkerを使用してspring.ftlマクロをFreemarkerテンプレートページにインポートするにはどうすればよいですか?Spring MVC、Sitemesh、Freemarkerを使用してspring.ftlをインポートする

Ted Young's configuration exampleに基づくSitemeshとFreemarkerを使用してSpring MVCアプリケーションを設定しました。 Spring MVC/Freemarker統合リファレンスによると、< @ spring.bind "command.name" />を介してバッキングモデルをビューにバインドするには、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が、私はGoogleの土地で解決策を見つけるしたことはありません。私も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"春のように/> – Raedwald

1

がなければ問題はその春はどこspring.ftlファイルの世話を知らないされています これは、ブート

/** 
* 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プロジェクトのための私のカスタム設定でありますローダーは.ftlのテンプレートを "/ WEB-INF/ftl"のファイルwarに、jarのファイルをからロードすることができます10。

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

そしてorg.springframework.web.servlet.view.freemarkerからspring.ftlを取得するbaseMvcTplLoaderローダー: あなたはFreeMarkerのescenseにセキュリティタグを使用したい場合は、この2行です。私はいくつかのexample projectまたはdocumentationの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; 
} 
関連する問題