由于前端技术和框架的兴起,现在使用后端模板的越来越少,同时后端基本都是基于SpringBoot进行开发,在集成freemarker方面就更容易了。

关于两者的集成文章很多,这里简单的记录下


方式1:使用默认配置

首先引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

其次修改配置

spring:
  freemarker:
  	enabled: true
    content-type: text/html
    prefix: 
    suffix: .html
    cache: false
    charset: UTF-8
    template-loader-path: classpath:/templates/


方式2:自定义配置

@Configuration
public class FreemarkerConfiguration {
	
	/**
	 * 覆盖SpringBoot中的默认配置。
	 * 源码可参考:org.springframework.boot.autoconfigure.freemarker.FreeMarkerServletWebConfiguration
	 * */
	@Bean(name = "freeMarkerViewResolver")
	@ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true)
	public FreeMarkerViewResolver freeMarkerViewResolver() {
		FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
		resolver.setCache(true);
		resolver.setOrder(0);
		resolver.setPrefix("");
		resolver.setSuffix(".html");
		resolver.setContentType("text/html; charset=UTF-8");
		resolver.setExposeRequestAttributes(true);
		resolver.setExposeSessionAttributes(true);
		resolver.setRequestContextAttribute("request"); // 为模板调用时,调用request对象的变量名</span>
		return resolver;
	}

	/**
	 * 覆盖SpringBoot中的默认配置。
	 * 源码可参考:org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
	 * */
	@Bean
	public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
		FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
		/*
		 * SpringBoot中的默认地址:classpath:/templates/
		 * 可参考源码:org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties
		 * */
		factory.setTemplateLoaderPath("classpath:/templates/freemarker");
		factory.setDefaultEncoding("UTF-8");
		
		Properties settings = new Properties();
		settings.put("recognize_standard_file_extensions", "true");
		factory.setFreemarkerSettings(settings);
		
		FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
		configurer.setConfiguration(factory.createConfiguration());

		Map<String, Object> sharedMap = new HashMap<String, Object>();
		sharedMap.put("sharedVar", "共享参数");
    
		configurer.getConfiguration().setSharedVariables(sharedMap);
		configurer.getConfiguration().setDateFormat("yyyy/MM/dd");
		configurer.getConfiguration().setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
		configurer.getConfiguration().setNumberFormat("#");// 防止页面输出数字,变成2,000
		return result;
	}
}


模板使用

在指定的路径下创建模板文件,然后在Controller中返回要被访问的模板

@Controller
public class PageController {

    @GetMapping(path = {"","/","/index"})
    public ModelAndView index() {
        System.out.println("controller-index");
        Map<String,String> userInfo = new HashMap<>() ;
        userInfo.put("username","你猜猜看") ;
        return new ModelAndView("index",userInfo);
    }
}