平時使用模板都是加載模板文件十拣,這次處理的文件是保存在數(shù)據(jù)庫的字符串柳琢。
項目使用的是spring-boot和freemarker整合
-
環(huán)境
JDK : 1.8
框架 : Spring boot
模板 : Freemarker
-
整合freemarker
<!--整合freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
-
使用字符串作模板
- 在類中注入模板配置
@Autowired
@Qualifier("freeMarkerConfiguration")
private Configuration freemarkerConf;
- 核心代碼
String templateContent="這是一個字符串加載的模板 ${name}";
// 新建一個字符串的模板加載器
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
// 設(shè)置模板 匀油,其中
stringTemplateLoader.putTemplate("myTemplate", templateContent);
freemarkerConf.setTemplateLoader(stringTemplateLoader);
freemarkerConf.clearTemplateCache();
Template template = freemarkerConf.getTemplate("myTemplate", "utf-8");
-
實際應(yīng)用
private Template createTemplate(String name, String templateContent) throws IOException {
Template template = freemarkerConf.getTemplate(name, "utf-8");
if (template != null) {
return template;
}
synchronized (this){ // 以下操作不是線程安全获雕,要加上同步
// 獲取模板加載器
TemplateLoader templateLoader = freemarkerConf.getTemplateLoader();
if(templateLoader != null && templateLoader instanceof StringTemplateLoader){
// 如果加載器已經(jīng)是字符串加載器富雅,則在原來的加載器上put一個新的模板
((StringTemplateLoader) templateLoader).putTemplate(name, templateContent);
freemarkerConf.setTemplateLoader(templateLoader);
}else{
// 如果原來的模板加載器不是字符串的(默認(rèn)是文件加載器)蒲犬,則新建
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate(name, templateContent);
freemarkerConf.setTemplateLoader(stringTemplateLoader);
}
// 這里要清一下緩存宜狐,不然下面可能會獲取不到模板
freemarkerConf.clearTemplateCache();
template = freemarkerConf.getTemplate(name, "utf-8");
return template;
}
}