使用freemarker对模板进行渲染
最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术。
在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染。前端,就不多说了,处理很简单,只有一个展示,一个保存操作。
后台,需要获取模板和数据,进行渲染后返回到前台,进行展示。
目前实现了输入字符串和输入文件两种形式。(20180409)
freemark技术的整合和使用如下:
1.引入maven依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
2.封装为utils工具类使用
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import org.apache.log4j.PropertyConfigurator; import com.winning.Application; import com.winning.polaris.admin.service.impl.UpgradeServiceImpl; import com.winning.polaris.comm.util.LogUtil; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; public class FreemarkerUtils { private static LogUtil logger = LogUtil.getInstance(UpgradeServiceImpl.class); private static String defaultCharacter = "UTF-8"; private static Configuration cfg; private FreemarkerUtils() { } static { cfg = new Configuration(Configuration.getVersion()); cfg.setDefaultEncoding(defaultCharacter); cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); } /** * 对模板进行渲染 * @param data 数据Map * @param tplStr 模板 * @return */ public static String generateString( Map<String, Object> data, String tplStr) { String result = null; String name="myStrTpl"; try { StringTemplateLoader stringTemplateLoader= new StringTemplateLoader(); stringTemplateLoader.putTemplate(name, tplStr); cfg.setTemplateLoader(stringTemplateLoader); Template template = cfg.getTemplate(name,defaultCharacter); StringWriter out = new StringWriter(); template.process(data, out); out.flush(); result= out.toString(); out.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 将模板渲染以后保存到文件 * @param templateFileDir 模板目录 * @param fileName 模板文件名称 * @param targetFilePath 渲染后文件名称 * @param dataMap 数据 * @return */ public static boolean renderingTemplateAndGenerateFile(String templateFileDir, String fileName,String targetFilePath,Map<String, Object> dataMap){ boolean flag=true; try { // 设置文件所在目录的路径 cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径 // 获取模版 Template template = cfg.getTemplate(fileName); // 设置输出文件名,和保存路径 File outFile = new File(targetFilePath); // 将模板和数据模型合并生成文件 重点设置编码集 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8")); // 生成文件 template.process(dataMap, out); // 关闭流 out.flush(); out.close(); } catch (Exception e) { logger.error("生产模板文件失败!",e); flag=false; } return flag; } public static void main(String[] args) { PropertyConfigurator.configure(Application.class.getClassLoader().getResourceAsStream("config" + File.separator + "log4j.properties")); Map<String,Object> dataMap=new HashMap<String, Object>(); dataMap.put("APP_HOME", "c:/test/appHome"); //F:\freemark boolean renderingTemplateAndGenerateFile = renderingTemplateAndGenerateFile("F:\\freemark\\", "temp.txt", "F:\\freemark\\temp.bat",dataMap); System.out.println(renderingTemplateAndGenerateFile); } }
3.单元测试
public class FreemarkerUtilsTest extends TestCase { public void generateStringTest(){ Map<String,Object> map= new HashMap<>(); map.put("date", "2017-05-11 11:55:55"); map.put("caseNo", "AJ00000001"); map.put("descrip", "这是描述信息=========="); String template="案件编号为:${caseNo!} " + " 日期为:${date!} " + " 自动获取日期为:${ .now?string('yyyy年MM月dd日')}" + "描述:${descrip!}"; String generateString = FreemarkerUtils.generateString(map, template); System.out.println("------"); System.out.println(generateString); } }
结果:案件编号为:AJ00000001 日期为:2017-05-11 11:55:55 自动获取日期为:2018年01月29日描述:这是描述信息==========
模板渲染完成。
当然,模板的渲染可以使用正则完成,但个人认为,模板引擎就是干这个的,而且各种情况考虑更为全面。
业务驱动技术,技术是手段,业务是目的。