1 Web 层开发
1.1 POM 添加依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
1.2 StatApp.java
package com.streaming.project.spark;
import com.streaming.project.dao.CourseClickCountDAO;
import com.streaming.project.domain.CourseClickCount;
import net.sf.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName StatApp
* @Description Web层开发
* @Author tzb
* @Date 2018/12/19 18:25
* @Version 1.0
**/
@RestController
public class StatApp {
private static Map<String, String> courses = new HashMap<>();
static {
courses.put("112", "Hadoop实战");
courses.put("128", "Spark快速入门");
courses.put("145", "Scala 入门");
courses.put("146", "Python 爬虫");
courses.put("130", "数据结构与算法分析");
courses.put("131", "Spark SQL项目实战");
}
@Autowired
CourseClickCountDAO courseClickCountDAO;
// @RequestMapping(value = "/course_click_dynamic", method = RequestMethod.GET)
// public ModelAndView courseClickCount() throws IOException {
// ModelAndView view = new ModelAndView("index");
//
// List<CourseClickCount> list = courseClickCountDAO.query("20181219");
//
// for (CourseClickCount model : list) {
// model.setName(courses.get(model.getName().substring(9)));
// }
//
// JSONArray json = JSONArray.fromObject(list);
//
// view.addObject("data_json",json);
//
// return view;
// }
@RequestMapping(value = "/course_click_dynamic", method = RequestMethod.POST)
@ResponseBody
public List<CourseClickCount> courseClickCount() throws IOException {
List<CourseClickCount> list = courseClickCountDAO.query("20181219");
for (CourseClickCount model : list) {
model.setName(courses.get(model.getName().substring(9)));
}
return list;
}
@RequestMapping(value = "/echarts", method = RequestMethod.GET)
public ModelAndView echarts() {
return new ModelAndView("echarts");
}
}
1.3 echarts.html
- 添加
jquery.js
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>stat</title>
<!-- 引入 ECharts 文件 -->
<script src="js/echarts.min.js"></script>
<!--引入 jQuery 文件-->
<script src="js/jQuery.js"></script>
</head>
<body>
通过 /echarts 请求跳转过来的页面
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main"
style="width: 600px;height:400px;position: absolute;top:50%;left: 50%;margin-top:-200px;margin-left:-300px"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: '实时流处理统计结果之访问量统计',
subtext: '实战课程访问次数',
x: 'center'
},
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: '访问次数',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: (function () { //<![CDATA[
var datas = [];
$.ajax({
type: "POST",
url: "/spark-streaming/course_clickcount_dynamic",
dataType: 'json',
async: false,
success: function (result) {
for (var i = 0; i < result.lenght; i++) {
datas.put({"value":result[i].value,"name":result[i].name})
}
}
})
return datas;
//]]>
}),
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>
访问 http://localhost:8081/spark-streaming/echarts
2 功能扩展
Spring Boot 整合 Echarts 动态获取HBase数据
- 动态传递当天的时间:在页面放一个时间插件(jQuery插件),默认只取当天数据;
- 自动刷新展示图:每隔一定时间请求刷新当前的数据