Импорт spring.ftl с использованием Spring MVC, Sitemesh, Freemarker - PullRequest
5 голосов
/ 09 декабря 2011

Как я могу импортировать макросы spring.ftl на страницу шаблона Freemarker, используя Spring MVC, Sitemesh и Freemarker?

Я настроил приложение Spring MVC с использованием Sitemesh и Freemarker на основе Пример конфигурации Теда Юнга . Согласно справочнику по интеграции 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

Другие сталкивались с этой проблемой , но мне еще предстоит найти решение в Google Land. Я также попытался использовать эту технику (архивирование spring.ftl, размещение его в META-INF / lib и добавление zip в путь сборки), но, похоже, это не сработало.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 31 июля 2015

Проблема в том, что Spring не знает, где искать файл spring.ftl: это моя пользовательская конфигурация для проекта MVC с использованием 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 загрузчика позволяют загружать .ftlшаблоны в war файлах из "/ WEB-INF / ftl" и из обычных jar файлов из src/resources/templates.Если вы хотите использовать теги безопасности в freemarker, то вот эти две строки:

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

и загрузчик baseMvcTplLoader для получения spring.ftl из org.springframework.web.servlet.view.freemarker.Я советую изучить шаблоны ftl в некоторых примерных проектах или документации , чтобы иметь представление о том, как spring.ftl работает.

Конфигурация заполнителя:не относится к конфигурации freemarker, но очень полезен для ввода значений в переменные из src/resources/application.properties с помощью аннотации @Value.

При этом вы можете использовать все spring мощность в freemarker шаблонов.

0 голосов
/ 09 февраля 2016

Мне нравится мой 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;
}
0 голосов
/ 13 февраля 2012
<#import "spring.ftl" as spring/>

Без /

...