Spring Boot Freemarker模板的使用

787 阅读1分钟

摘要:

主要介绍了基于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);
    }

}

目录结构

image.png

  • 访问curl http://localhost:8080/freemarker/test1

输出如下内容

image.png

  • 文件下载类似的访问连接即可进行下载