最近在工作中使用到了Echarts来制作图表,在网上搜了好多例子几乎都是千篇一律的在前台写死一些js,然后把变量通过ajax或者遍历集合的方式插进去,这样子一旦某一页面的图表一多,就会异常混乱,偶然在开源中国看到有人做成了个Echarts对象的jar包,在后台进行完美封装传回一个option在前台接收了并set进option即可。试了试,效果非常好。
下面给出例子代码:

该方法返回的keyword指向了前台负责图表显示的jsp页面




    1. public String keyword() {  
    2. this.dateNum == null || this.dateNum.equals("")) {  
    3. this.dateNum = "5" ;  
    4.        }  
    5.        return "keyword" ;   
    6.    }




    该方法根据jsp的ajax传回来显示的条数dateNum进行数据库取值(这地方我没有使用实时拿值,而是通过定时来把数据更新进一张表,从而图表拿值会非常迅速)

    可以看出我定义了一个Option对象,里面的参数都可以在里面以方法或者属性的方式调用。最后封装好Option后,把他放入jsonObject对象传回前台一接收json值即可。



    1. public String getKeyWordData() throws ParseException{  
    2. user = (LoginUser) ((SecurityContext) ServletActionContext  
    3.                 .getRequest().getSession()  
    4.                 .getAttribute("SPRING_SECURITY_CONTEXT")).getAuthentication()  
    5.                 .getPrincipal();  
    6. id = user.getId() ;  
    7. num = Integer.parseInt(this.dateNum) ;  
    8. jsonObj = new JSONObject() ;  
    9.        //取到该用户的所有关键字放入legendName数组  
    10. <String> names = this.cacheCountManager.getKeywordNames(id) ;  
    11. legendName = new String[names.size()] ;  
    12. i=0;i<names.size();i++) {  
    13. name = names.get(i) ;  
    14.            legendName[i] = name ;  
    15.        }  
    16. riqiArr = new String[num] ;  
    17. j=num;j>0;j--) {  
    18. riqi = getStrDate(String.valueOf(j)) ;  
    19.            riqiArr[num-j] = riqi ;  
    20.        }  
    21. option=new GsonOption();  
    22.        option.title().text("关键词文章统计");  
    23.        option.tooltip().trigger(Trigger.axis);  
    24.        option.legend().data(legendName);  
    25. axis = new ValueAxis();  
    26.        axis.type(AxisType.category).boundaryGap(false).data(riqiArr);  
    27.        option.xAxis(axis);  
    28. yaxis = new CategoryAxis();  
    29.        yaxis.type(AxisType.value);  
    30.        option.yAxis(yaxis);  
    31. <Series> seriess = new ArrayList<Series>() ;  
    32. mp = new MarkPoint() ;  
    33.        mp.data(new Data().type(MarkType.max).name("最大值"),  
    34.                new Data().type(MarkType.min).name("最小值")) ;  
    35. i=0;i<names.size();i++) {  
    36. countArr = new Integer[num] ;  
    37. line = new Line() ;  
    38. name = names.get(i) ;  
    39. j=num;j>0;j--) {  
    40. riqi = getStrDate(String.valueOf(j)) ;  
    41.                countArr[num-j] = this.cacheCountManager.getCount(id, riqi, name) ;  
    42.            }  
    43.            line.name(name).type(SeriesType.line).data(countArr).markPoint(mp) ;  
    44.            seriess.add(line) ;  
    45.        }  
    46.        option.series(seriess);  
    47. jsonObj=JSONObject.fromObject(option.toString());  
    48.        return "echartsJson";  
    49.    }

    页面显示部分很简洁。




    1. <div id="main"  style="height: 400px; border: 1px solid #ccc; padding: 10px;">图形正在加载中...</div>



    1. $(function(){  
    2.     require([ 'echarts','echarts/chart/line' ],DrawEChart);  
    3. });



    1. function DrawEChart(ec) {  
    2.     var myChart;  
    3. myChart = ec.init(document.getElementById('main'));  
    4.     myChart.showLoading({  
    5. <span style="white-space:pre">    </span>text: "图表数据正在努力加载...",  
    6.     });  
    7. date = $("#dateNum").val() ;  
    8.     $.ajax({  
    9. <span style="white-space:pre">    </span>type : "post",  
    10. <span style="white-space:pre">    </span>data:{"dateNum":date},  
    11.         url : "${ctx}/statistics/statistics!getKeyWordData.action",  
    12.         dataType : "json",  
    13.         success : function(data) {  
    14.             myChart.setOption(data.jsonObj);  
    15. <span style="white-space:pre">    </span>myChart.hideLoading();  
    16.         },  
    17.         error : function(errorMsg) {  
    18. <span style="white-space:pre">    </span>alert("不好意思大爷,图表请求数据失败啦!");  
    19.         }  
    20.     });  
    21. }


    jar包下载:http://mvnrepository.com/artifact/com.github.abel533/ECharts