FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker项目中主要用途就是来渲染一些静态文件,例如html静态页面、word等等。在这篇博客里就简单介绍一下使用FreeMarker来通过ftl模板来渲染html和word。
首先贴出我用到的工具类和jar:
freemarker-2.3.20.jar
package com.utils; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; /** * freemarker模板引擎渲染工具类 * Created by wdq on 2018/12/24. */ public class FreeMarkerUtil { /** * 模板引擎常用渲染方式 * 1.变量渲染 ${message} 支持date、boolean、string、integer * 2.数据迭代 <#list userList as user></#list> 类似jstl的<c:foreach></c:foreach> * 3.条件判断 * <#if message=12> * <#elseif message=13> * <#else> * </#if> */ /**| * 渲染模板 * @param templatePath 模板路径 * @param templateName 模板名称 * @param data 渲染数据 * @param path 输出路径 * @return */ public static boolean applyTemplate(String templatePath,String templateName, Map<String,Object> data,String path){ try{ //创建Configuration对象 Configuration config=new Configuration(); //设置模板路径 config.setDirectoryForTemplateLoading(new File(templatePath)); //设置编码格式 config.setDefaultEncoding("UTF-8"); //创建一个模板对象 Template template = config.getTemplate(templateName); //指定渲染对象 File file = new File(path); Writer writer=new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); //模板渲染 template.process(data, writer); //关闭io流 writer.flush(); writer.close(); return true; }catch (Exception e){ return false; } } }
首先,你需要有一个编辑好样式的html文件(页面中引用js等静态资源注意使用http绝对路径),然后把页面中需要进行数据渲染的地方使用表达式替换,在这里我拿一个简单的页面举个例子,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1,user-scalable=no"/> <title></title> </head> <body> ${message} <#list ObjList as objs> <p>${objs.name}</p> </#list> <#if message=12> <p>我还小</p> <#elseif message=13> <p>我比你大</p> <#else> <p>我不告诉你</p> </#if> </body> </html>
FreeMarker的数据渲染规则和jstl基本一样,在这里${message}就代表把数据中key为message的变量值展示到这个位置(支持富文本);和jstl有区别的是FreeMarker的数据迭代和if判断,在这里数据迭代使用的标签是<#list>,标签中直接把数据中的list进行foreach迭代objList as objs,把每一轮的值都赋给临时变量objs,在迭代中可以继续使用${objs.属性名}进行数据获取;FreeMarker中的if标签有点类似于java中的if,使用<#if 条件判断></#if>进行条件筛选。
按照FreeMarker的渲染格式编辑好模板后,可以把当前html改成.ftl文件,区分他是模板文件,然后就可以使用上面的工具类渲染页面了,添加数据的方式和java里向request中塞值一样。
Map<String,Object> data = new HashMap<String,Object>(); data.put("message","<h1 style=\"color:red;\">FreeMarker 基本用法 FreeMarker和spring整合集成</h1>"); List<String[]> list = new ArrayList<>(); list.add(new String[]{"sadsdsa"}); list.add(new String[]{"aaaaaaa"}); data.put("list",list); FreeMarkerUtil.applyTemplate("C:\\Users\\wdq\\Desktop","test.ftl",data,"C:\\Users\\wdq\\Desktop\\test.html");
word的数据渲染和html的一样,但是word的模板创建比html要稍微复杂一点。首先你需要在office中根据你想要的样式编辑好word文档,需要替换的部分先拿测试数据填补,编辑好以后在word编辑器左上角“文件-->另存为”选择保存类型为“Word XML文档”,保存后使用note++打开这个xml文档,效果应该和下图类似:
xml文件中<w:开头的都是word的标签,在notepad++里使用快捷搜索之前写的测试数据,快速定位到需要渲染数据的位置,然后把测试数据用FreeMarker的渲染表达式替换,搞定以后保存并把后缀改为.ftl,之后就可以和渲染html一样给word渲染数据了。
如有更好的思路欢迎留言!!!