12

我正在尝试使用 Freemarker 和 Java 配置创建一个 Spring MVC 应用程序。

我习惯于使用 JSP,但我想我会在这个项目中给 Freemarker 一个旋转。

我已将 Freemarker 添加为依赖项,并且 Maven 正在下载 jar:

        <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.20</version>
    </dependency>

我正在尝试使用 Spring 的 3.2.3.RELEASE 版本。

我的 MVC 配置,通过阅读类似问题组装而成:

@ComponentScan(basePackages="yhj.*")
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{


@Bean
public ViewResolver viewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setCache(true);
    resolver.setPrefix("");
    resolver.setSuffix(".ftl");
    return resolver;

}

@Bean
public FreeMarkerConfigurer freemarkerConfig() {
    FreeMarkerConfigurer result = new FreeMarkerConfigurer();
    result.setTemplateLoaderPath("/WEB-INF/views/");
    return result;

}
}

当我尝试运行它时,出现编译错误,我的 IDE 告诉我方法“setTemplateLoaderPath(String)”无法解析。

那么......看起来是使用 Freemarker 配置 Spring MVC 的正确方法吗?如果这是问题,我需要向我的 POM 添加什么依赖项?

4

4 回答 4

14

我对 Spring Boot 1.0.2、Spring 4.0.3 和 FreeMarker 2.3.20 的解决方案是以下类:

@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter {
  @Bean
  public ViewResolver viewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setCache(true);
    resolver.setPrefix("");
    resolver.setSuffix(".ftl");
    resolver.setContentType("text/html; charset=UTF-8");
    return resolver;
  }

  @Bean
  public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
    FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
    factory.setTemplateLoaderPath("classpath:templates");
    factory.setDefaultEncoding("UTF-8");
    FreeMarkerConfigurer result = new FreeMarkerConfigurer();
    result.setConfiguration(factory.createConfiguration());
    return result;
  }
}

此外,您需要与pom.xml问题和 DaFoot 自己的答案相同的更改。

于 2014-04-30T13:41:10.000 回答
11

好吧,我已经对编译问题进行了排序,在我的 pom 中添加了一个依赖项......

    <dependency><!-- needed for freemarker FreeMarkerConfigurer stuff -->
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
于 2013-07-13T14:47:27.390 回答
5
@Bean(name = "freeMarkerViewResolver")
    public FreeMarkerViewResolver getFreeMarkerViewResolver() { 
        FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
        resolver.setPrefix("/WEB-INF/views/json/");
        resolver.setSuffix(".json");
        resolver.setOrder(2);
        resolver.setContentType("application/json");
        resolver.setCache(true);
        return resolver;
    }

    @Bean(name = "freemarkerConfig")
    public FreeMarkerConfigurer getFreemarkerConfig() throws IOException, TemplateException { 
        FreeMarkerConfigurer result = new FreeMarkerConfigurer();
        result.setTemplateLoaderPaths("/"); // prevents FreeMarkerConfigurer from using its default path allowing setPrefix to work as expected
        return result;
    }
于 2015-03-21T20:50:21.110 回答
4

这是我使用 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文件和. 如果您想在 freemarker 中使用安全标签,则重点是以下两行:warjarsrc/resources/templates

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

baseMvcTplLoader以及获取spring.ftlfrom的加载程序org.springframework.web.servlet.view.freemarker。我建议在一些示例项目文档中探索 ftl 模板,以了解其spring.ftl工作原理。

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

有了这个,您可以使用freemarker模板中的所有弹簧力量。

于 2015-07-31T14:55:28.853 回答