平时使用模板都是加载模板文件,这次处理的文件是保存在数据库的字符串。
项目使用的是spring-boot和freemarker整合
-
环境
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();
// 设置模板 ,其中
stringTemplateLoader.putTemplate("myTemplate", templateContent);
freemarkerConf.setTemplateLoader(stringTemplateLoader);
freemarkerConf.clearTemplateCache();
Template template = freemarkerConf.getTemplate("myTemplate", "utf-8");
-
实际应用
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){
// 如果加载器已经是字符串加载器,则在原来的加载器上put一个新的模板
((StringTemplateLoader) templateLoader).putTemplate(name, templateContent);
freemarkerConf.setTemplateLoader(templateLoader);
}else{
// 如果原来的模板加载器不是字符串的(默认是文件加载器),则新建
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate(name, templateContent);
freemarkerConf.setTemplateLoader(stringTemplateLoader);
}
// 这里要清一下缓存,不然下面可能会获取不到模板
freemarkerConf.clearTemplateCache();
template = freemarkerConf.getTemplate(name, "utf-8");
return template;
}
}