摘要:
主要介绍了基于
freemarker模版引擎动态生成我们想要的代码片段,用于配置化实现不同的返回数据。
maven引入
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
FreemarkerHandler工具类
该工具类,实现模板字符串的输入,解析后输出结果字符串,让上层业务对象更加灵活。
@Component
public class FreemarkerHandler {
private static final String TEMPLATE_NAME = "HANDLER_TEMPLATE";
/**
* 执行把模板转换为内容
* @param dataMap 数据Map
* @param templateContent 模板内容
* @param formatBlankCharacter 是否把空字符替换掉
* @param formatOtherCharacter 是否把换行符分页符替换掉
* @return
* @throws Exception
*/
public String execute(Map<String,Object> dataMap,String templateContent,boolean formatBlankCharacter,boolean formatOtherCharacter) throws Exception{
if(formatBlankCharacter){
templateContent = templateContent.replaceAll("\s*<","<");
}
if(formatOtherCharacter){
templateContent = templateContent.replaceAll("\t\n\r","");
}
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate(TEMPLATE_NAME,templateContent);
Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
configuration.setTemplateLoader(stringTemplateLoader);
configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
Template template = configuration.getTemplate(TEMPLATE_NAME);
StringWriter writer = new StringWriter();
template.process(dataMap,writer);
return writer.toString();
}
}
具体应用
该应用案例基于
SpringBoot,如果是其他框架则需要对应修改
- 输入字符串模板,输出字符串结果
@RestController
@RequestMapping(value = "freemarker")
public class FreemarkerController {
@Autowired
private FreemarkerHandler freemarkerHandler;
@GetMapping(value = "test")
public String test() throws Exception{
Map<String,Object> dataMap = new HashMap<>();
dataMap.put("name","张三");
String templateContent = "<user>" +
"<name>${name}</name>" +
"</user>";
String result = freemarkerHandler.execute(dataMap,templateContent,true,true);
System.out.println(result);
return result;
}
}
-- 结果
- 读取
resources下的文件 -- 模板内容
<user>
<name>${name}</name>
<#if age?? && age == 10 >
<age>${age}</age>
</#if>
</user>
-- 读取代码
@RestController
@RequestMapping(value = "freemarker")
public class FreemarkerController {
@Autowired
private FreemarkerHandler freemarkerHandler;
@GetMapping(value = "test1")
public String test1() throws Exception{
Map<String,Object> dataMap = new HashMap<>();
dataMap.put("name","张三");
dataMap.put("age",10);
InputStream inputStream =new ClassPathResource("template/user.ftl").getInputStream();
String templateContent = "";
try(BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))){
templateContent = reader.lines().collect(Collectors.joining(""));
}
String result = freemarkerHandler.execute(dataMap,templateContent,true,true);
System.out.println(result);
return result;
}
}
- 转换为文件进行下载
把得到的结果,转化成为了
byte字节流,放入到输入流,进行文件下载
@RestController
@RequestMapping(value = "freemarker")
public class FreemarkerController {
@Autowired
private FreemarkerHandler freemarkerHandler;
@GetMapping(value = "test3")
public void test3(HttpServletResponse response) throws Exception{
response.setHeader("Content-Disposition", "attachment;filename=" + UUID.randomUUID().toString()+".xml");
String result = this.test1();
ServletOutputStream out = response.getOutputStream();
InputStream inputStream = new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8));
IOUtils.copy(inputStream, out);
}
}
目录结构
- 访问
curl http://localhost:8080/freemarker/test1
输出如下内容
- 文件下载类似的访问连接即可进行下载