echarts+ajax+java制作图表
整理了下学校男女身高体重数据,顺便当复习java了
charts在绘图前我们需要为其准备一个具备高宽的 DOM 容器。
<body> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="main" style="width: 600px;height:400px;"></div> </body>
然后就可以通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成分析图
图表样式就不细说了,这里就是借鉴了echarts官网的一个demo 然后加了个ajax
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>hziee男女学生身高体重分布</title> <script src="js/echarts.js"></script> <script src="js/jquery-3.2.1.min.js"></script> </head> <body> <div id="main" style="height:800px"></div> <script type="text/javascript"> var myChart = echarts.init(document.getElementById('main')); option = { title: { text: '男女学生身高体重分布', subtext: '数据来源: 2017体测数据' }, grid: { left: '3%', right: '7%', bottom: '3%', containLabel: true }, tooltip: { // trigger: 'axis', showDelay: 0, formatter: function (params) { if (params.value.length > 1) { return params.seriesName + ' :<br/>' + params.value[0] + 'cm ' + params.value[1] + 'kg '; } else { return params.seriesName + ' :<br/>' + params.name + ' : ' + params.value + 'kg '; } }, axisPointer: { show: true, type: 'cross', lineStyle: { type: 'dashed', width: 1 } } }, toolbox: { feature: { dataZoom: {}, brush: { type: ['rect', 'polygon', 'clear'] } } }, brush: {}, legend: { data: ['女性', '男性'], left: 'center' }, xAxis: [ { type: 'value', scale: true, axisLabel: { formatter: '{value} cm' }, splitLine: { show: false } } ], yAxis: [ { type: 'value', scale: true, axisLabel: { formatter: '{value} kg' }, splitLine: { show: false } } ], series: [ { name: '女性', type: 'scatter', data: [], markArea: { silent: true, itemStyle: { normal: { color: 'transparent', borderWidth: 1, borderType: 'dashed' } }, data: [[{ name: '女性分布区间', xAxis: 'min', yAxis: 'min' }, { xAxis: 'max', yAxis: 'max' }]] }, markPoint: { data: [ {type: 'max', name: '最大值'}, {type: 'min', name: '最小值'} ] }, markLine: { lineStyle: { normal: { type: 'solid' } }, data: [ {type: 'average', name: '平均值'}, {xAxis: 149.07} ] } }, { name: '男性', type: 'scatter', data: [], markArea: { silent: true, itemStyle: { normal: { color: 'transparent', borderWidth: 1, borderType: 'dashed' } }, data: [[{ name: '男性分布区间', xAxis: 'min', yAxis: 'min' }, { xAxis: 'max', yAxis: 'max' }]] }, markPoint: { data: [ {type: 'max', name: '最大值'}, {type: 'min', name: '最小值'} ] }, markLine: { lineStyle: { normal: { type: 'solid' } }, data: [ {type: 'average', name: '平均值'}, {xAxis: 166.57} ] } } ] }; myChart.showLoading(); loadDATA(option); // 为echarts对象加载数据 function loadDATA(option) { var girl = []; var boy = []; $.ajax({ type: "post", async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行) url: "servlet/ShowInfo", data: {}, dataType: "json", //返回数据形式为json success: function (result) { if (result) { for (var i = 0; i < result.length; i++) { if (result[i].sex === "女") { girl.push([result[i].height, result[i].bweight]); } else { boy.push([result[i].height, result[i].bweight]); } } myChart.hideLoading(); myChart.setOption({ //载入数据 series: [ //填入系列(内容)数据 { // 根据名字对应到相应的系列 name: '女性', data: girl }, { name: '男性', data: boy } ] }); } } }); myChart.setOption(option); } </script> </body>
写完才发现有个平均值,懒得写后端了,直接在数据库里算了一下放上去了
SELECT AVG(CONVERT(`身高`,DECIMAL)) FROM fitness2017 WHERE `性别`='男'"
这里还是主要记录下其他的实现过程
function loadDATA(option) { var girl = []; var boy = []; $.ajax({ type: "post", async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行) url: "servlet/ShowInfo", data: {}, dataType: "json", //返回数据形式为json success: function (result) { if (result) { for (var i = 0; i < result.length; i++) { if (result[i].sex === "女") { girl.push([result[i].height, result[i].bweight]); } else { boy.push([result[i].height, result[i].bweight]); } } myChart.hideLoading(); myChart.setOption({ //载入数据 series: [ //填入系列(内容)数据 { // 根据名字对应到相应的系列 name: '女性', data: girl }, { name: '男性', data: boy } ] }); } } }); myChart.setOption(option); }
前端用ajax请求servlet获取后台数据库内容返回的json
记得配置好xml
servlet代码
import FitnessSystem.entity.Info; import FitnessSystem.logic.Student; import com.google.gson.*; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; /** * Created by Ruilin on 2017/12/27. */ public class ShowInfo extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { // request.setCharacterEncoding("utf-8"); Student stu = new Student(); try { ArrayList<Info> stuArray = stu.getStudentList(); Gson gson = new Gson(); String json = gson.toJson(stuArray); //将json数据返回给客户端 response.setContentType("text/html; charset=utf-8");; response.getWriter().write(json); } catch (SQLException e) { e.printStackTrace(); } } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { this.doPost(request, response); } }
这里把list中的对象转换为Json格式的数组
Gson gson = new Gson(); String json = gson.toJson(stuArray);
需要导入
import com.google.gson.*;
连接数据库
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Created by Ruilin on 2017/12/27. */ public class DbManage { private static String driver = null; private static String url = null; private static String password = null; private static String user = null; private Connection con = null; private Statement state = null; private ResultSet rs = null; //加载驱动 static { try { driver = "com.mysql.jdbc.Driver"; url = "jdbc:mysql://localhost:3306/xxxxx?useUnicode=true&characterEncoding=UTF-8"; password = "xxxxxx"; user = "root"; Class.forName(driver).newInstance(); } catch (Exception e) { e.printStackTrace(); } } //创建连接 public static Connection getConnection() { try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); return null; } } //返回查询结果 public ResultSet ExecuteQuery(String sql) throws SQLException { con = this.getConnection(); state = con.createStatement(); rs = state.executeQuery(sql); return rs; } public void closeConnection() { try { if (!this.con.equals(null)) this.con.close(); } catch (SQLException e) { e.printStackTrace(); } this.con = null; } }
实体类封装类(Info)我再次懒得发了
然后是获取数据
import FitnessSystem.db.DbManage; import FitnessSystem.entity.Info; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; /** * Created by Ruilin on 2017/12/27. */ public class Student { public ArrayList<Info> getStudentList() throws SQLException { ArrayList<Info> allStu=new ArrayList<Info>(); String sqlText="select * from fitness2017"; DbManage db=new DbManage(); ResultSet rs=null; rs=db.ExecuteQuery(sqlText); while (rs.next()){ Info stuInfo=new Info(); stuInfo.setSex(rs.getString("性别")); stuInfo.setHeight(rs.getString("身高")); stuInfo.setWeight(rs.getString("体重")); allStu.add(stuInfo); } db.closeConnection(); return allStu; } }
简单的总结下过程,前端用ajax请求Servlet,Servlet使用Student类获数据库取信息(装入List),再用Gson工具将该List转换成Json对象返回给客户端,客户端接收到返回的Json对象后对其进行解析并将相应数据填入Echarts中,最后显示图表