最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术。

在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染。前端,就不多说了,处理很简单,只有一个展示,一个保存操作。

后台,需要获取模板和数据,进行渲染后返回到前台,进行展示。

目前实现了输入字符串和输入文件两种形式。(20180409)

freemark技术的整合和使用如下:

1.引入maven依赖

  1. <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
  2. <dependency>
  3. <groupId>org.freemarker</groupId>
  4. <artifactId>freemarker</artifactId>
  5. <version>2.3.23</version>
  6. </dependency>

2.封装为utils工具类使用

  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.OutputStreamWriter;
  5. import java.io.StringWriter;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8.  
  9. import org.apache.log4j.PropertyConfigurator;
  10.  
  11. import com.winning.Application;
  12. import com.winning.polaris.admin.service.impl.UpgradeServiceImpl;
  13. import com.winning.polaris.comm.util.LogUtil;
  14.  
  15. import freemarker.cache.StringTemplateLoader;
  16. import freemarker.template.Configuration;
  17. import freemarker.template.Template;
  18.  
  19. public class FreemarkerUtils {
  20. private static LogUtil logger = LogUtil.getInstance(UpgradeServiceImpl.class);
  21. private static String defaultCharacter = "UTF-8";
  22. private static Configuration cfg;
  23. private FreemarkerUtils() {
  24. }
  25. static {
  26. cfg = new Configuration(Configuration.getVersion());
  27. cfg.setDefaultEncoding(defaultCharacter);
  28. cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
  29. }
  30. /**
  31. * 对模板进行渲染
  32. * @param data 数据Map
  33. * @param tplStr 模板
  34. * @return
  35. */
  36. public static String generateString(
  37. Map<String, Object> data, String tplStr) {
  38. String result = null;
  39. String name="myStrTpl";
  40. try {
  41. StringTemplateLoader stringTemplateLoader= new StringTemplateLoader();
  42. stringTemplateLoader.putTemplate(name, tplStr);
  43. cfg.setTemplateLoader(stringTemplateLoader);
  44. Template template = cfg.getTemplate(name,defaultCharacter);
  45. StringWriter out = new StringWriter();
  46. template.process(data, out);
  47. out.flush();
  48. result= out.toString();
  49. out.close();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. return result;
  54. }
  55. /**
  56. * 将模板渲染以后保存到文件
  57. * @param templateFileDir 模板目录
  58. * @param fileName 模板文件名称
  59. * @param targetFilePath 渲染后文件名称
  60. * @param dataMap 数据
  61. * @return
  62. */
  63. public static boolean renderingTemplateAndGenerateFile(String templateFileDir,
  64. String fileName,String targetFilePath,Map<String, Object> dataMap){
  65. boolean flag=true;
  66. try {
  67. // 设置文件所在目录的路径
  68. cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径
  69. // 获取模版
  70. Template template = cfg.getTemplate(fileName);
  71. // 设置输出文件名,和保存路径
  72. File outFile = new File(targetFilePath);
  73. // 将模板和数据模型合并生成文件 重点设置编码集
  74. BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
  75. // 生成文件
  76. template.process(dataMap, out);
  77. // 关闭流
  78. out.flush();
  79. out.close();
  80. } catch (Exception e) {
  81. logger.error("生产模板文件失败!",e);
  82. flag=false;
  83. }
  84. return flag;
  85. }
  86.  
  87. public static void main(String[] args) {
  88. PropertyConfigurator.configure(Application.class.getClassLoader().getResourceAsStream("config" + File.separator + "log4j.properties"));
  89.  
  90. Map<String,Object> dataMap=new HashMap<String, Object>();
  91. dataMap.put("APP_HOME", "c:/test/appHome");
  92. //F:\freemark
  93. boolean renderingTemplateAndGenerateFile = renderingTemplateAndGenerateFile("F:\\freemark\\", "temp.txt",
  94. "F:\\freemark\\temp.bat",dataMap);
  95.  
  96. System.out.println(renderingTemplateAndGenerateFile);
  97. }
  98.  
  99. }

3.单元测试

  1. public class FreemarkerUtilsTest extends TestCase {
  2.  
  3. public void generateStringTest(){
  4.  
  5. Map<String,Object> map= new HashMap<>();
  6. map.put("date", "2017-05-11 11:55:55");
  7. map.put("caseNo", "AJ00000001");
  8. map.put("descrip", "这是描述信息==========");
  9. String template="案件编号为:${caseNo!} "
  10. + " 日期为:${date!} "
  11. + " 自动获取日期为:${ .now?string('yyyy年MM月dd日')}"
  12. + "描述:${descrip!}";
  13. String generateString = FreemarkerUtils.generateString(map, template);
  14. System.out.println("------");
  15. System.out.println(generateString);
  16. }
  17. }

结果:案件编号为:AJ00000001    日期为:2017-05-11 11:55:55  自动获取日期为:2018年01月29日描述:这是描述信息==========

模板渲染完成。

当然,模板的渲染可以使用正则完成,但个人认为,模板引擎就是干这个的,而且各种情况考虑更为全面。

使用freemarker对模板进行渲染的更多相关文章

  1. FreeMarker的模板文件语法

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...

  2. flask 在模板中渲染错误消息

    在模板中渲染错误消息 如果form.valicate_on_submit()返回False,说明验证没有通过,对于没有验证通过的字段,WTForms会把错误信息添加到表单类的errors属性中,这是一 ...

  3. flask 在模板中渲染表单

    在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板.首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实 ...

  4. FreeMarker数据模板引擎全面教程mark

    http://blog.csdn.net/fhx007/article/details/7902040/#comments 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复 ...

  5. Ajax接收Json数据,调用template模板循环渲染页面的方法

    一. 后台接口吐出JSON数据 后台php接口中,需要写三个部分: 1.1 开头header规定数据格式: header("content-type:application/json;cha ...

  6. Vue2.0源码学习(1) - 数据和模板的渲染(上)

    准备 一.首先去GitHub上把vue源码download下来,传送门:https://github.com/vuejs/vue 二.搭建一个vue-cli跑起来,用于代码调试,不看着代码动起来只看源 ...

  7. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

  8. iOS:使用模板引擎渲染HTML界面

    在实际开发中,UIWebView控件接受一个HTML内容,用于相应的界面,下面是该API的接口: - (void)loadHTMLString:(NSString *)string baseURL:( ...

  9. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

随机推荐

  1. Hibernate Criteria使用

    hibernate中Criteria的完整用法 Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现.SQL语句如何编写,是Hibernate框架的核心 ...

  2. docker 在window10下的安装

    在win10下安装docker 打开下载页面 https://store.docker.com/editions/community/docker-ce-desktop-windows 打开控制面板 ...

  3. composer在phpstorm中安装代码库

    E:\php\PHPTutorial\WWW\kmmhtt>composer install composer 安装地址 :https://getcomposer.org/download/

  4. bootstrap的日期选择器

    时间框偏移解决办法 首先导入js和css文件 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" ...

  5. 分布式 +rides

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  6. android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法

    1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...

  7. Hive 任务优化 tips

    1.  集群任务队列: 一般有  root.default, root.online, root.offline, root.spark-thiftserver Hue提交的任务一般默认在 defau ...

  8. SpringBoot 之jsp

    Boot 内嵌的tomcat 是不支持jsp 的, jetty 也是. 虽然boot也是有默认配置一个InternalResourceViewResolver ,但是它并不像我们在springmvc ...

  9. background-position,有逗号和没逗号:截然不同的结果

    写星级评分demo的时候,发现background-position这个属性有点神奇 如上图,在其值中加“,”与不加“,”会带来截然不同的结果,来研究一哈,顺便把这个属性复习一下 1.backgrou ...

  10. 第三篇、Python函数

    1.函数和过程的定义: 1) 函数定义:函数是逻辑结构化和过程化的一种编程方法. 2) 过程定义:过程就是简单特殊没有返回值的函数. 当一个函数/过程没有使用return显示的定义返回值时,pytho ...