导言

本次的博客,笔者将会向读者分享的是,如何通过freemarker的模板生成HTML的文件。众所周知,有时候项目上需要开发人员通过java的代码动态生成HTML文件,如日报、月报、账务报表等。为了可提高访问的性能,我们会预先生成HTML文件,这个的话可以提高访问的效率。在这一次博客中,笔者将会通过一个例子来分享这个功能,这个例子的功能点是:首先,将一份Json的文件转化为对象,及将对象转换为Json字符串;其次,将Map的数据转化为HTML文件;最后,通过js技术对HTML的页面做一些修改。那么,在博客中,笔者向读者分享如何将Json转化为对象和将对象转换为json字符串。(注意,可能之前的博客,笔者有写过类似的文章,但本次使用的包和方法不一样。)

将对象封装成Json字符串

如果读者在平时开发时使用的这个类net.sf.json.JSONObject,那么可以直接用JSONObject.fromObject()的方法将对象转化为JSON的字符串。如果读者要自己写一个方法来转换的话,那么需要考虑的是被转换的对象是Map类型还是List类型或是其它的类型。笔者在开发时经常是对于Map类型和List类型来进行转换为Json的字符串,对于其它的类型是不处理的。所以以下的代码可能的点局限性,笔者可以在此基础上进行拭修改。

public static Object jsonEnclose(Object obj) {try {if (obj instanceof Map) {   //如果是Map则转换为JsonObjectMap<String, Object> map = (Map<String, Object>)obj;Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();JSONStringer jsonStringer = (JSONStringer) new JSONStringer().object();while (iterator.hasNext()) {Entry<String, Object> entry = iterator.next();jsonStringer.key(entry.getKey()).value(jsonEnclose(entry.getValue()));}JSONObject jsonObject = new JSONObject(new JSONTokener(jsonStringer.endObject().toString()));return jsonObject;} else if (obj instanceof List) {  //如果是List则转换为JsonArrayList<Object> list = (List<Object>)obj;JSONStringer jsonStringer = (JSONStringer) new JSONStringer().array();for (int i = 0; i < list.size(); i++) {jsonStringer.value(jsonEnclose(list.get(i)));}JSONArray jsonArray = new JSONArray(new JSONTokener(jsonStringer.endArray().toString()));return jsonArray;} else {return obj;}} catch (Exception e) {return e.getMessage();}}

将Json字符串转换为对象

上面的方法中,笔者向大家介绍了如何将对象转换为Json字符串,那么接下笔者将向大家介绍如何将Json字符串转换为对象。大伙儿都知道,Json的格式有以两个[]中括号开始的可以两个{}大括号开始的,所以在转换之前,我们需要做判断。笔者使用的方法是会用正则表达式来判断。如:"\"([^\\\" ]+?)\":"判断是否以[]中括号开始,"^\\{.*\\}$"这个是判断是否以大括号开始的。其实,看到这些读者应该知道,这两都对应的就是JsonArray和JsonObject。当然,我们知道,Json的文件可能含有嵌套的Json,也就是说多层的json,所以要将这个文件完全转换为对象,需要我们使用递归的方法,这个才可将Json文件完全转换为对象。

private final static String regex = "\"([^\\\" ]+?)\":";/*** 一个方法解析多层json数据  json + 正则 + 递归* @param jsonStr* @return */public static Object jsonParse(final String jsonStr) {if (jsonStr == null) throw new NullPointerException("JsonString shouldn't be null");try {if (isJsonObject(jsonStr)) {final Pattern pattern = Pattern.compile(regex);final Matcher matcher = pattern.matcher(jsonStr);final Map<String, Object> map = new HashMap<String, Object>();final JSONObject jsonObject = new JSONObject(jsonStr);try {while (matcher.find()) {String groupName = matcher.group(1);Object obj = jsonObject.opt(groupName);if (isJsonObject(obj+"") || isJsonArray(obj+"")) {matcher.region(matcher.end() + (obj+"").replace("\\", "").length(), matcher.regionEnd());map.put(groupName, jsonParse(obj+""));} else {if(obj != null)map.put(groupName, obj+"");}}} catch (Exception e) {// TODO: handle exception}return map;} else if (isJsonArray(jsonStr)) {List<Object> list = new ArrayList<Object>();try {JSONArray jsonArray = new JSONArray(jsonStr);for (int i = 0; i < jsonArray.length(); i++) {Object object = jsonArray.opt(i);list.add(jsonParse(object+""));}} catch (Exception e) {// TODO: handle exception}return list;} } catch (Exception e) {// TODO: handle exception}return jsonStr;}

以上的代码可能缺少了判断json的格式,下面的代码中,笔者给出了两种Json格式的判断。

 /*** To determine whether a string is JsonObject {@link org.json.JSONObject}* @param jsonStr {@link java.lang.String}* @return boolean*/private static boolean isJsonObject(final String jsonStr) {if (jsonStr == null) return false;return Pattern.matches("^\\{.*\\}$", jsonStr.trim());}/*** To determine whether a string is JsonArray {@link org.json.JSONArray};* @param jsonStr {@link java.lang.String}* @return boolean*/private static boolean isJsonArray(final String jsonStr) {if (jsonStr == null) return false;return Pattern.matches("^\\[.*\\]$", jsonStr.trim());}

总结

以上的内容就是笔者向读者介绍的如何将对象转换为json字符串,和如何将Json字符串转换为对象。在此,读者两次声明类似的博客笔者已经介绍过,不过本次使用的方法是不一样的。使用的ja包如下。

使用freemarker模板生成html文件(一)相关推荐

  1. freemarker 模板生成pdf文件并下载

    利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...

  2. freemarker模板生成pdf文件

    文章目录 1.pom依赖 2.ftl模板以及宋体文件 2.1.文件路径 2.2.ftl文件模板(test.ftl) 3.controller生成pdf文件 1.pom依赖 <!--freemar ...

  3. freemarker 生成java_半自动化Java代码生成器[利用freemarker模板生成]

    rapid-generator 半自动化Java代码生成器[利用freemarker模板生成] 增加一些定制和扩展, 修改为基于MAVEN的格式. 整体架构保持不变. 增加的特性为: 支持表名前缀去除 ...

  4. Freemarker模板生成排版缩进问题

    在将Freemarker作为模板使用时,生成的目标文件(HTML或xml或其他类型文件)时,往往会出现排版错乱的问题. 主要是:明明没有那么多占位符或缩进,但生成出来的文件却有对应的缩进. 类似下图效 ...

  5. springboot结合Freemarker模板生成docx格式的word文档(附代码)

    首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...

  6. JavaWeb(14) 页面静态化之使用freemarker模板生成一个html静态页面

    题外话:        页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言( ...

  7. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  8. java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...

  9. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

  10. Freemark 模板生成doc文件,xml doc文件转docx 文件,docx文件转pdf文件

    freemark 模板生成doc文件,此doc文件为xml格式,无法直接转pdf 需要doc转docx文件,才能转pdf 方法1:docx4j 转 pdf 方法2: e-iceblue docx 转 ...

最新文章

  1. linux(6/17)--文件打包上传和下载
  2. # vmware异常关机后,虚拟系统无法启动的解决办法
  3. 1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)
  4. springboot redis 刷新时间_「SpringBoot实战」SpringCache + Redis实现数据缓存
  5. 系统mysql数据库服务器,系统mysql数据库服务器
  6. python两人一碰_python运用pygame库实现双人弹球小游戏
  7. 协议圣经 -协议之服务编写(九)
  8. Linux下QT创建项目错误处理
  9. Windows下编译sqlite3
  10. 重置IE浏览器的操作
  11. cad动态块制作翻转_cad创建动态块实例教程:翻转参数和动作的应用的介绍
  12. iOS 手动实现KVO / iOS KVO底层原理
  13. STM32单片机的学习
  14. 2020-04-13
  15. php webshell 木马,消灭php webshell与一句话木马
  16. Unity 接入百度AI - 通用物体和场景识别
  17. Logistic回归-数学原理(1)机器学习实战
  18. 移动互联网的黄金时代,真的结束了
  19. 最简单的js实现上传头像并正常回显
  20. 02_SHELL编程之变量定义

热门文章

  1. ....................................thinkpad E480 用户初体验..............................
  2. hadoop常见问题汇总
  3. Android 圆角的效果实现
  4. ajax 传送很多html字符串到前台例子
  5. [导入]关于中文文本的截取
  6. H3C VLAN同步MVRP实验
  7. NP、OSPF Stub区域
  8. 华为 “OSPF” 多区域配置
  9. LNMP详解(十二)——Nginx URL重写实战
  10. 华三 h3c super vlan配置