网站首页 > 技术文章 正文
在上一篇教程中,我们通过ECharts实现了数据可视化的饼图展示,只不过数据都是写死的。实际情况中,数据应该是通过处理或者是从数据库中取出来的。所以这一篇我们写一个通过ajax来请求后台数据,然后将其通过饼图显示出来的Demo。
工具是eclipse+Tomcat容器,前台html展示,通过ajax向servlet请求数据库中的数据,然后servlet通过jdbc取出数据以json格式返回给前台,前台再绑定数据。
json数据格式如下:[{"name":"其他","value":200},{"name":"推荐","value":2000},{"name":"相关阅读","value":500},{"name":"频道","value":300}]
数据表如下
定义与数据表相同的模型类demo.java
public class Demo {
private String name;
private int value;
public Demo(String name, int value) {
super();
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
定义数据库操作类获取数据库里的数据 DbOperate.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import Model.Demo;
public class DbOperate {
private static String url = "jdbc:mysql://localhost:3306/dir?rewriteBatchedStatements=true";//连接字符串
private static String user = "root";//用户名
private static String password = "";//密码
public List<Demo> getDemo() throws Exception {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
Connection conn = DriverManager.getConnection(url, user, password);//获得数据库连接
List<Demo> list = new ArrayList<Demo>();//定义list
Statement s = null;
String sql = "select * from demo";//sql语句
s = conn.createStatement();
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
list.add(new Demo(rs.getString("name"), rs.getInt("value")));//将对象放入list
}
if (s != null) {
s.close();
}
if (conn != null) {
conn.close();
}
return list;//返回list
}
}
定义servlet接收请求并返回数据 DataProcessing.java
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Db.DbOperate;
import Model.Demo;
import com.alibaba.fastjson.JSON;
/**
* Servlet implementation class DataProcessing
*/
@WebServlet("/DataProcessing")
public class DataProcessing extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DataProcessing() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
List<Demo> list;//定义list
try {
list = new DbOperate().getDemo();//将数据库中的数据赋给list
String jsonArr = JSON.toJSONString(list);//将list转为json
response.setCharacterEncoding("UTF-8");//设定编码
response.getWriter().print(jsonArr);//将json返回给前台
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由前一篇文章我们知道,数据是由option对象中的series数组里的data数组决定的,而图例是由option对象中的legend对象里的data决定的,所以我们先定义一个数组和一个对象来接收后台传过来的数据。
var dataArray = [];
var legendData = [];
然后ajax向后台发起请求
$.ajax({
async : false,//是否异步,这里我们选择同步
cache : false,//不启用缓存
type : 'POST',//以post方式请求
dataType : "json",//数据格式是json
url : "/Demo/DataProcessing",//请求的servlet路径
error : function() {//请求失败后处理函数
alert('请求失败');
},
success : function(data) { //请求成功后处理函数
var str = JSON.stringify(data);//收到的data是json对象,所以要转成json字符串
var array = JSON.parse(str);//json字符串转数组
for (i = 0; i < array.length; i++) {
var dataObj = {//定义数据对象,里面包括value和name
value : 0,
name : ''
}
dataObj.name = array[i].name;//收到数据里的name赋给dataObj对象里的name属性
dataObj.value = array[i].value;//收到数据里的value赋给dataObj对象里的value属性
dataArray[i] = dataObj;//将处理后的数据对象赋给数据对象数组
legendData[i] =array[i].name; //图例数据的赋值
}
}
});
最后还是定义option,将dataArray和legendData放入其中
option = {
title : {
text : '阅读来源分析',
subtext : '',
x : '200',
textStyle : {
fontSize : 30,
align : 'center',
lineHeight : 56,
}
},
tooltip : {
trigger : 'item',
formatter : "{a} <br/>{b} : {c} ({d}%)"
},
legend : {
orient : 'vertical',
left : 'left',
data : legendData,
},
series : [ {
name : '阅读来源分析',
type : 'pie',
radius : '80px',
center : [ '20%', '20%' ],
data : dataArray,
itemStyle : {
normal : {
label : {
show : true,
formatter : '{b}:{d}%',
position : 'outside'
},
labelLine : {
show : true
}
},
emphasis : {
shadowBlur : 10,
shadowOffsetX : 0,
shadowColor : 'rgba(0, 0, 0, 0.5)'
}
}
} ]
};
demo.setOption(option);
这样通过ajax动态绑定数据就完成了
通过火狐浏览器的开发者工具可以看出,我们访问网页时,网页会提交一个指向http://localhost:8080/Demo/DataProcessing的请求,这就是servlet的地址,响应的是json格式的数据
由于不能上传附件,所以Demo的所有代码可以私信获取,谢谢
猜你喜欢
- 2024-10-12 安详解在vue中使用echarts图表实例代码
- 2024-10-12 echarts两点连线,中间没有数值情况下实现连线,x轴标题超长解决
- 2024-10-12 ECharts—百度可视化图表插件(echarts数据可视化网站)
- 2024-10-12 vue之将echart封装为组件(vue echart 组件)
- 2024-10-12 百度echarts使用(百度 echarts)
- 2024-10-12 「ECharts 术语速查手册」简介(echarts emphasis)
- 2024-10-12 分享7个常用的echarts示例(echarts介绍)
- 2024-10-12 Vue实战090:Vue使用ECharts图表详解
- 2024-10-12 9、echarts 在 vue 中怎么引用?(必会)
- 2024-10-12 Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)