天天看點

HighChart擴充-動态擷取資料

HighChart擴充實踐-動态擷取資料封裝jQuery工具類

這篇文章沒有介紹highChart的基礎篇,主要實作了封裝工具類,動态從背景加載資料。

背景Servlet代碼:

package com.kenneth.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;
@SuppressWarnings("unused")
public class LoadDataServlet extends HttpServlet {
    private static final long serialVersionUID = L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");// 這條語句指明了向用戶端發送的内容格式和采用的字元編碼.

        PrintWriter out = response.getWriter();

        // 擷取模拟資料list
        // List<String[]> list = getModelList();

        // 擷取模拟資料Map
//      Map<String, List<String[]>> map = new HashMap<String, List<String[]>>();

        Gson gson = new Gson();
        String json = gson.toJson(getModelMap());
        out.write(json);

        out.close();

    }

    // 用于處理用戶端發送的POST請求

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        doGet(request, response);

    }

    private List<String[]> getModelList() {
        List<String[]> list = new ArrayList<String[]>();

        for (int i = ; i < ; i++) {
            String[] item = new String[];
            for (int j = ; j < item.length; j++) {
                item[j] = Math.random() *  + "";
            }
            list.add(item);
        }
        return list;
    }

    private Map<String, Map<String,Object>> getModelMap() {
        Map<String, Map<String,Object>> map = new HashMap<String, Map<String,Object>>();
        for (int i = ; i < ; i++) {
            Map<String,Object> obj = new HashMap<String,Object>();
            String[] item = new String[];
            for (int j = ; j < item.length; j++) {
                item[j] = Math.random() *  + "";
            }
            obj.put("data", item);
            obj.put("name", "類别"+i);
            map.put(i+"", obj);
        }
        return map;
    }
}

           

封裝highChart工具類對象:

var ChartUtil = {
    /**
     * 建立圖表
     * 
     * @param options
     * @returns
     */
    createChart : function(options) {
        if (options && options != {}) {
            var defaultOptions =  ChartUtil.initOptions();
            // 如果有配置參數 , 則 把配置參數添加到預設參數中
            options = $.extend(defaultOptions, options);
        }
        return ChartUtil.loadData(options);
    },
    /**
     * 加載預設配置
     */
    initOptions : function() {
        return {
            loadDataConfig : {
                url : "",
                params : {}
            },
            callback : ChartUtil.callback
        };
    },
    /**
     * 加載動态資料
     * 
     * @param options
     */
    loadData : function(options) {
        var config = options.loadDataConfig;
        var callback = options.callback;
        if (config && config.url != "" && $.type(config.params) == "object") {
            $.post(config.url, config.params, function(data) {
                var dataArr = JSON.parse(data);
                if ($.type(callback) == "function")
                    callback(options, dataArr);
            });
        }
        if ($.type(callback) == "function")
            callback(options);
    },
    /**
     * 預設的回調函數 加載動态資料執行完成之後執行
     * 
     * @param options
     * @param dataResult
     */
    callback : function(options, dataResult) {
        // 當有結果集時
        if (dataResult) {
            options.series = ChartUtil.parseObjToSeries(dataResult);
        }
        options.chart = options.chart || {};
        options.chart['renderTo'] = options.selectorId;
        return new Highcharts.Chart(options);
    },
    /**
     * 将整個對象轉換成序列對象
     */
    parseObjToSeries : function(objs) {
        var series = [];
        $.each(objs, function(index, item) {
            var obj = [];
            // list
            if ($.type(item) == "array") {
                obj = ChartUtil.getItemObj(item);
            }
            // key-value 格式
            if ($.type(item) == "object") {
                obj = ChartUtil.getItemObj(item.data);
            }
            item.data = obj;
            series.push(item);
        });
        return series;
    },
    /**
     * 擷取序列中的單行對象
     */
    getItemObj : function(data) {
        var obj = [];
        $.each(data, function(objIndex, objItem) {
            obj.push(parseFloat(objItem));
        });
        return obj;
    }
};
           

封裝jQuery插件用于調用:

(function($) {
    var ChartUtil = ChartUtil || "";
    $.fn.createDynChart = function(options) {
        options = options || {};
        // 選擇器沒有找到對象
        if ($(this).length ==) {
            return false;
        }
        // 周遊選擇器擷取到的界面對象,在每個内部生成一個圖表
        $.each($(this), function(index, item) { if (!$(item).attr("id")) { $(item).attr("id", "$default_chart_" + index); } options['selectorId'] = $(item).attr("id"); if ($.type(ChartUtil) != "object") { alert("請先引入圖表生成工具再使用該插件!"); return; } ChartUtil.createChart(options); });
    }
})(jQuery);
           

前台界面代碼:

<style>
    .my-charts{
        width: px;
        margin: auto;
    }
  </style>
<script type="text/javascript">
        $(function(){
            var options = {
                title : {
                    text : "測試報表"
                },
                xAxis : {
                    categories : [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun' ]
                },
                chart : {
                    type : "column"
                },
                loadDataConfig : {
                    "url" : $("base").attr("href") + "test/loadData",
                    "params" : {}
                }
            };
            $(".my-charts").createDynChart(options);
        });
    </script>
    <div class="my-charts"></div>
    <div class="my-charts"></div>
           

這樣,就完成了把任意元素轉換成highChart圖表的功能。也可以把封裝的highChart工具類分離出來單獨使用。

生成的效果圖:

HighChart擴充-動态擷取資料

由于界面我用的class樣式擷取的元素有2個,是以會生成2個圖表。

源代碼項目下載下傳:源代碼項目點此下載下傳

繼續閱讀