如上图所描绘的,在不断刷新test.html请求页面时,上图total.html页面会实时的更新(1秒响应更新一次),折线图会实时进行上下变动。其中需要导入echarts.min.js和jquery-3.5.1.min.js和fastjson-1.2.53.jar包。
0.首先是创建RequestServlet这个类,创建一个时间集合和与之相对象的值集合,就是每一时间段,有多少的请求数量。比如上图19:14时间段有20多个请求量。代码如下:
package com.wei.total;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
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 com.alibaba.fastjson.JSON;
/**
* Servlet implementation class RequestServlet
*/
@WebServlet("/req")
public class RequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RequestServlet() {
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
ServletContext context = request.getServletContext();// 获得全局对象
List<String> timeList = (List<String>) context.getAttribute("timeList");
List<Integer> valueList = (List<Integer>) context.getAttribute("valueList");
response.setContentType("text/html;charset=utf-8");
// response.getWriter().println(timeList.toString());
// response.getWriter().println("<br/>");
// response.getWriter().println(valueList.toString());
Map resultMap=new HashMap();
resultMap.put("timeList",timeList );
resultMap.put("valueList",valueList );
String json= JSON.toJSONString(resultMap);
response.getWriter().println(json);
}
}
1.然后是RequestTotalListener这个类实现 ServletContextListener,ServletRequestListener两个接口,代码如下:
package com.wei.total;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class RequestTotalListener implements ServletContextListener,ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request=(HttpServletRequest)sre.getServletRequest();
String url=request.getRequestURL().toString();
if (url.endsWith("/req")==true) {
return;
}
// TODO Auto-generated method stub
//timeList: 10:02,10:03,10:04
//ValueList 5 20 15
List<String> timeList=(List)sre.getServletContext().getAttribute("timeList");
List<Integer> valueList=(List)sre.getServletContext().getAttribute("valueList");
Date date =new Date();
SimpleDateFormat sdfDateFormat=new SimpleDateFormat("HH:mm");
String time=sdfDateFormat.format(date);//得到当前时间
//10:05
if (timeList.indexOf(time)==-1) {//查找对应的数据集合中是否存在,时间是否存在,不存在返回结果为-1
timeList.add(time);
valueList.add(1);
sre.getServletContext().setAttribute("timeList", timeList);
sre.getServletContext().setAttribute("valueList", valueList);
}else {
int index= timeList.indexOf(time);
int value=valueList.get(index);
valueList.set(index,value+1);
sre.getServletContext().setAttribute("valueList", valueList);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
ServletContextListener.super.contextDestroyed(sce);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
List timeList=new ArrayList();
List valueList=new ArrayList();
sce.getServletContext().setAttribute("timeList", timeList);
sce.getServletContext().setAttribute("valueList", valueList);
}
}
2.进行数据统计页面total.html的编写:代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/echarts.min.js"></script>
<script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>
</head>
<body>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 600px; height: 500px;"></div>
<script type="text/javascript">
function showChart(){
$.ajax({
url:"./req",
type:"get",
dataType:"json",
success:function(json){
console.log(json.timeList);
console.log(json.valueList);
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));//得到图表对象
// 指定图表的配置项和数据
var option = {
title : {
text : '请求流量分析统计'
},
tooltip : {},
legend : {
data : [ '访问量' ]
},
xAxis : {
data : json.timeList
},
yAxis : {},
series : [ {
name : '访问量',
type : 'line',//bar柱状图,line折线图
data : json.valueList
} ]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
})
}
window.setInterval("showChart()",1000);//1秒向浏览器刷新一次结果
</script>
</body>
</html>
3.测试页面,可以准备多个测试页面,一定要注意html页面一定要在webcontent下进行创建,发布后,打开进行多次点击,可以发现total.html的折线图会实时的进行变化,也可以换成树状图等图。代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是第一个测试页面</h1>
<h2>I am test page one</h2>
</body>
</html>