spring boot + freemarker 静态化以及遇到的坑

页面静态化是网站开发过程中经常遇到的一个问题,今天主要讲的是spring boot 结合freemarker的静态化的方法。

第一步,引入相应的jar包

	
	    org.springframework.boot
	    spring-boot-starter-freemarker
    

第二步,注入Configuration

	@Autowired
	private Configuration configuration;

注意引入的包路径

读取模板生成静态文件

StringWriter out = new StringWriter();
		try {
			// 第三步:设置模板文件使用的字符集。一般就是utf-8.  
			configuration.setDefaultEncoding("utf-8");  
			// 第四步:加载一个模板,创建一个模板对象。  
			Template template = configuration.getTemplate("works_share.ftl");
			template.process(dataModel, out);  
			String url_suffix = "works/"+reportType+"/"+vts_MyWorks.getPkWorks()+".html";
			PubAliyunUtil.putObjectToResouceALL(out.toString().getBytes("UTF-8"), url_suffix);
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

这里是直接写入OSS的,所以采用的字符流的方式。

注意一个特殊的地方,springboot在集成freemarker的有一些默认配置。默认的模板路径在classpath:/templates/下面,所以需要在resources下新建templates文件夹

这样模板文件才能被读取到。spring boot的默认设置如下:

 
# FREEMARKER (FreeMarkerAutoConfiguration)
spring.freemarker.allow-request-override=false # Set whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.
spring.freemarker.allow-session-override=false # Set whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.
spring.freemarker.cache=false # Enable template caching.
spring.freemarker.charset=UTF-8 # Template encoding.
spring.freemarker.check-template-location=true # Check that the templates location exists.
spring.freemarker.content-type=text/html # Content-Type value.
spring.freemarker.enabled=true # Enable MVC view resolution for this technology.
spring.freemarker.expose-request-attributes=false # Set whether all request attributes should be added to the model prior to merging with the template.
spring.freemarker.expose-session-attributes=false # Set whether all HttpSession attributes should be added to the model prior to merging with the template.
spring.freemarker.expose-spring-macro-helpers=true # Set whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".
spring.freemarker.prefer-file-system-access=true # Prefer file system access for template loading. File system access enables hot detection of template changes.
spring.freemarker.prefix= # Prefix that gets prepended to view names when building a URL.
spring.freemarker.request-context-attribute= # Name of the RequestContext attribute for all views.
spring.freemarker.settings.*= # Well-known FreeMarker keys which will be passed to FreeMarker's Configuration.
spring.freemarker.suffix= # Suffix that gets appended to view names when building a URL.
spring.freemarker.template-loader-path=classpath:/templates/ # Comma-separated list of template paths.
spring.freemarker.view-names= # White list of view names that can be resolved.

此种配置,只能读取classpath下的路径。如果想要读取其他路径则要重写freemarker的默认配置,在spring boot中,你可以这样做:

@Configuration
public class TemplateLoader 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 {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPaths("file:绝对路径","http://www.xxx.com/");
        configurer.setDefaultEncoding("UTF-8");
        return configurer;
    }
 
}

 

你可能感兴趣的:(spring-boot,Freemarker)