第一次使用echart从后台获取数据动态显示到页面

本文介绍如何使用Echarts绘制图表,包括下载最新版本的Echarts、创建数据Bean类、设计服务接口和服务实现,以及前端页面的具体实现。通过示例展示了如何从前端获取数据并展示为柱状图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次使用Echart绘制图表,看了两天,终于结合后台给整出来了。走过之后再看看,其实很简单的。不多说了,直接上图:

第一步:去echarts官方下载最新的js; 官方地址 : echarts.baidu.com

            我下的是3.4.0版的:echarts.min.js

第二步:创建一个ReportDataBean,在该类中设置两个属性:List<String>categories 和 List<Integer> data,具体如下图
        ReportDataBean:用来记录和存储需要传递到前台页面中显示的数据集合

[java]  view plain  copy
  1. public class ReportDataBean {  
  2.     private List<String> categories;  
  3.     private List<Integer> data;  
  4.     public List<String> getCategories() {  
  5.         return categories;  
  6.     }  
  7.     public void setCategories(List<String> categories) {  
  8.         this.categories = categories;  
  9.     }  
  10.     public List<Integer> getData() {  
  11.         return data;  
  12.     }  
  13.     public void setData(List<Integer> data) {  
  14.         this.data = data;  
  15.     }     
  16. }  

第三步:创建EchartReportService ,TestDataService,和各自实现。EchartReportService是所以对外调用的主Service,而TestDataService是具体的业务Service

       1.EchartReportService:模板接口,用来以后进行不同模板间进行扩展 

[java]  view plain  copy
  1. public interface EchartReportService {    
  2.     public JSONObject getDataJson();      
  3. }  
       2.TestDataService :具体实现数据实现接口,用来实现获取具体业务相关的数据,继承了EchartReportService
[java]  view plain  copy
  1. public interface TestDataService extends EchartReportService {  
  2. }  

       3.EchartReportServiceImpl           

[java]  view plain  copy
  1. @Service  
  2. public class EchartReportServiceImpl implements EchartReportService {  
  3.     @Override  
  4.     public JSONObject getDataJson() {  
  5.         return null;  
  6.     }  
  7. }  

       4.TestDataServiceImpl       

[java]  view plain  copy
  1. @Service  
  2. public class TestDataServiceImpl extends EchartReportServiceImpl implements TestDataService {  
  3.     /** 
  4.      * 模拟获取数据库后的数据 
  5.      * @return 
  6.      */  
  7.     @Override  
  8.     public JSONObject getDataJson() {  
  9.         ReportDataBean bean = new ReportDataBean();  
  10.         List<String> categories = Arrays.asList("衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子");  
  11.         List<Integer> data = Arrays.asList(52036101020);  
  12.         bean.setCategories(categories);  
  13.         bean.setData(data);  
  14.         JSONObject jsonObj = (JSONObject) JSON.toJSON(bean);   
  15.         return jsonObj;  
  16.     }  
  17. }  

第四步:testReport.jsp是具体显示统计图表的页面,里面有三个最重要的方法。这里只做最简单的实现

            callbackFn方法是处理从后台获取的数据然后前台解析的。

            initReport方法是初始化基本图标横轴和纵轴的方法。在这个方法里,只留有xAxis.data和series.data是动态从数据库获取后赋值的。

            createTestReport方法是将callbackFn和initReport方法合并的入口方法。这样为以后可以在同一类型的图表显示模板进行编辑和处理进行扩充

            testReport.jsp 代码如下:           

[html]  view plain  copy
  1. <#assign base=request.contextPath />  
  2. <!DOCTYPE html>  
  3. <html>  
  4.   
  5. <head>  
  6.   
  7.     <title>报表测试</title>  
  8.     <meta charset="utf-8">  
  9.     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  10.     <meta name="renderer" content="webkit">  
  11.     <meta name="keywords" content="">  
  12.     <meta name="description" content="">  
  13.   
  14.     <link href="${base}/statics/css/bootstrap.min.css" rel="stylesheet">  
  15.     <link href="${base}/statics/css/font-awesome.css?v=4.4.0"  rel="stylesheet">  
  16.     <link href="${base}/statics/css/animate.css"  rel="stylesheet">  
  17.     <link href="${base}/statics/css/style.css?v=4.1.0"  rel="stylesheet"><base target="_blank">  
  18.     <!-- jqgrid-->  
  19.     <link href="${base}/statics/css/plugins/jqgrid/ui.jqgrid.css" rel="stylesheet">  
  20.       
  21.     <style>  
  22.         /* Additional style to fix warning dialog position */  
  23.           
  24.         #alertmod_table_list_2 {  
  25.             top: 900px !important;  
  26.         }  
  27.     </style>  
  28.   
  29. </head>  
  30.   
  31. <body class="gray-bg">  
  32.     <div class="wrapper wrapper-content  animated fadeInRight">  
  33.         <div class="row">  
  34.             <div class="col-sm-12">  
  35.                 <div class="ibox ">  
  36.                     <div class="ibox-title">  
  37.                         <h5>测试报表</h5>  
  38.                     </div>  
  39.                     <div class="ibox-content">  
  40.                         <div id="main" style="width: 600px;height:400px;"></div>  
  41.                     </div>  
  42.                 </div>  
  43.             </div>  
  44.         </div>  
  45.     </div>  
  46.   
  47.     <script src="${base}/statics/js/jquery.min.js?v=2.1.4"></script>  
  48.     <script src="${base}/statics/js/bootstrap.min.js?v=3.3.6"></script>  
  49.     <script src="${base}/statics/js/plugins/layer/layer.min.js"></script>  
  50.     <script src="${base}/statics/js/demo/layer-demo.js"></script>  
  51.     <script src="${base}/statics/js/plugins/peity/jquery.peity.min.js" ></script>  
  52.     <script src="${base}/statics/js/plugins/jqgrid/i18n/grid.locale-cn.js" ></script>  
  53.     <script src="${base}/statics/js/plugins/jqgrid/jquery.jqGrid.min.js" ></script>  
  54.     <script src="${base}/statics/js/content.js" ></script>  
  55.     <script src="${base}/statics/js/jgrid/data.js"></script>  
  56.     <script src="${base}/statics/js/echarts/echarts.min.js"></script>  
  57.       
  58.     <script type="text/javascript">  
  59.         // 直接页面写的调用ajax的方法  
  60.         function callbackFn(myChart,jsonURL){  
  61.             $.ajax({  
  62.                  url:jsonURL,  
  63.                  dataType:"json",  
  64.                  success:function(jsonData){  
  65.                        
  66.                      myChart.setOption({  
  67.                         xAxis: {  
  68.                             data: jsonData.categories  
  69.                         },  
  70.                         series: [{  
  71.                             // 根据名字对应到相应的系列  
  72.                             name: '销量',  
  73.                             data: jsonData.data  
  74.                         }]  
  75.                     });  
  76.                     // 设置加载等待隐藏  
  77.                     myChart.hideLoading();  
  78.                  }  
  79.              });  
  80.         }  
  81.         // 初始化echar报表的方法  
  82.         function initReport(myChart){  
  83.               
  84.             // 显示标题,图例和空的坐标轴  
  85.             myChart.setOption({  
  86.                 title: {  
  87.                     text: '异步数据加载示例'  
  88.                 },  
  89.                 tooltip: {},  
  90.                 legend: {  
  91.                     data:['销量']  
  92.                 },  
  93.                 xAxis: {  
  94.                     data: []  
  95.                 },  
  96.                 yAxis: {},  
  97.                 series: [{  
  98.                     name: '销量',  
  99.                     type: 'bar',  
  100.                     data: []  
  101.                 }]  
  102.             });  
  103.         }  
  104.           
  105.         function createTestReport(showDivId,jsonURL){  
  106.             var myChart = echarts.init(document.getElementById(showDivId));  
  107.             // 初始化report对象  
  108.             initReport(myChart);  
  109.             myChart.showLoading({text: '正在努力的读取数据中...'  });  
  110.             // 调用后台获取json数据  
  111.             callbackFn(myChart,jsonURL);  
  112.         }  
  113.     </script>   
  114.          
  115.     <script type="text/javascript">  
  116.          $(document).ready(function(){  
  117.             var showDivId = 'main';  
  118.             var jsonURL = "${base}/report/v1/getTestReportJson.do";  
  119.             createTestReport(showDivId,jsonURL);  
  120.         });  
  121.     </script>  
  122.      
  123. </body>  
  124.   
  125. </html>  


注意事项及说明:

           由于此功能是集成到其他功能上的,所以只进行了涉及到的基本的代码编写和上传。功能扩展和细节还不完善,只是做个引子抛砖引玉用

执行结果:

             



<think>好的,我现在需要帮助用户解决ECharts饼图动态更新数据和自定义标签格式的问题,同时处理AJAX返回的数据。首先,我得回想一下用户提供的三个引用内容,看看有什么可以参考的。 引用[1]提到了初始化ECharts实例和通过AJAX获取数据的基本结构。用户需要动态更新数据,所以这部分是关键。可能需要用到setOption方法来更新图表数据。引用[2]讨论的是在数据请求失败时如何处理,比如显示“暂无数据”并清除旧的ECharts实例。这可能涉及到在每次更新前销毁旧的实例,或者确保数据正确加载后重新渲染。引用[3]则涉及动态生成series和颜色控制,特别是根据数据的不同设置不同的颜色,比如正确选项用橙色标出。这提示我需要处理数据格式,并在series的itemStyle中应用不同的样式。 接下来,我需要分步骤解决用户的问题。首先是动态更新数据。这通常包括使用AJAX从服务器获取数据,处理返回的JSON,然后更新图表。根据引用[1],AJAX请求成功后,应该将数据填充到ECharts的option中,然后调用setOption。需要注意的是,可能需要先清空之前的数据,或者在每次更新时重新初始化图表,避免旧数据残留。此外,引用[2]中提到的问题,如果在更新数据失败时没有正确处理,可能会导致图表无法渲染,所以需要在AJAX的success和error回调中处理不同的情况,比如在error时显示提示信息,并移除旧的ECharts实例属性。 然后是自定义标签格式。ECharts的标签格式可以通过formatter函数来定义,用户可能需要在series的label配置中使用formatter,根据数据项的值动态生成标签内容。例如,显示百分比、数值或其他自定义格式。引用[3]中的normal_func函数示例了如何根据标志位改变颜色,这可能需要在itemStyle中设置normal和emphasis的样式,类似地,标签的formatter也可以在这里配置。 另外,动态生成series可能需要根据AJAX返回的数据结构来动态构造series数组。例如,如果每个数据项需要不同的颜色或标签格式,就需要在series的data数组中遍历返回的数据,并为每个数据点配置相应的样式和标签。 还需要考虑性能问题,比如在多次更新数据时,是否应该销毁旧的图表实例,或者复用现有的实例。引用[2]中提到,当数据请求失败时,插入提示信息并删除_echarts_instance_属性,这样可以确保下次请求成功时能正确渲染。因此,在每次更新数据前,可能需要检查是否存在现有的图表实例,如果存在,先销毁它,再重新初始化,以避免冲突。 最后,代码示例可能需要包括AJAX请求的处理、数据格式转换、图表初始化和更新,以及错误处理。同时,需要展示如何配置标签的formatter函数和动态颜色设置。可能需要结合引用[3]中的颜色控制方法,根据数据中的某个字段(如flag)来动态设置颜色。 总结步骤: 1. 初始化ECharts实例,并配置基本的option结构。 2. 使用AJAX获取数据,处理成功和失败的情况。 3. 在成功回调中,处理返回的数据,生成series所需的data数组,包括标签格式和颜色。 4. 更新图表的option,调用setOption方法,可能需要先清空或销毁旧实例。 5. 在失败回调中,显示错误信息,并清理ECharts实例属性,确保下次能正确渲染。 6. 自定义标签格式通过formatter函数实现,颜色通过itemStyle设置,根据数据动态调整。</think>以下分步骤说明如何实现ECharts饼图动态更新数据与自定义标签格式: ### 一、基础图表初始化 ```javascript // 初始化图表容器 function initChart(domId) { return echarts.init(document.getElementById(domId)); } // 基础配置项 let baseOption = { title: { text: '动态饼图示例' }, tooltip: { trigger: 'item' }, series: [{ type: 'pie', radius: '55%', label: { // 标签全局配置 formatter: '{b}: {c} ({d}%)' // 自定义标签格式 } }] }; ``` ### 二、动态数据更新流程 1. **AJAX数据请求** ```javascript function fetchData(url, callback) { $.ajax({ url: url, success: function(response) { callback(response.data); // 成功回调 }, error: function() { handleChartError('main'); // 失败处理 } }); } ``` 2. **数据处理与图表更新** ```javascript function updateChart(chart, rawData) { const processedData = rawData.map(item => ({ name: item.item_name, value: item.item_value, itemStyle: normal_func(item.flag) // 根据flag设置颜色[^3] })); chart.setOption({ series: [{ data: processedData, label: { // 动态标签配置 formatter: ({ name, percent, value }) => `${name}\n数值:${value}\n占比:${percent.toFixed(2)}%` } }] }, true); // 第二个参数true表示合并配置 } ``` ### 三、错误处理机制 ```javascript function handleChartError(domId) { const container = document.getElementById(domId); container.innerHTML = '<div class="no-data">暂无数据</div>'; delete container._echarts_instance_; // 关键属性清理[^2] } ``` ### 四、完整执行流程 ```javascript // 主执行函数 function main() { const chart = initChart('main'); chart.setOption(baseOption); fetchData('/api/getPieData', (data) => { updateChart(chart, data); }); } // 页面加载后执行 $(document).ready(() => { main(); setInterval(main, 5000); // 每5秒自动刷新 }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值