使用freemarker模板生成html文件(一)

导言

本次的博客,笔者将会向读者分享的是,如何通过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则转换为JsonObject
                Map map = (Map)obj;
                Iterator> iterator = map.entrySet().iterator();
                JSONStringer jsonStringer = (JSONStringer) new JSONStringer().object();
                while (iterator.hasNext()) {
                    Entry 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则转换为JsonArray
                List list = (List)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 map = new HashMap();
                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 list = new ArrayList();
                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包如下。

你可能感兴趣的:(Java,其它)