ServletRequestListener
ServletRequestListener接口能监听每一个request的请求的创建和销毁,用来记录网站的浏览量非常合适,可以按照每一分钟来统计有多少request请求,请求产生的数据技术则可以放在ServletContext全局对象中进行设置和读取
实现requestInitialized()方法
@Override
public void requestInitialized(ServletRequestEvent arg0) {
HttpServletRequest hsr= (HttpServletRequest)arg0.getServletRequest();
//过滤统计请求,避免多计算
String url= hsr.getRequestURL().toString();
if(url.endsWith("/reqt")){
return;
}
//获取ServletContext
ServletContext sc =arg0.getServletContext();
List<String> timelist =(List)sc.getAttribute("timelist");
List<Integer> valuelist =(List)sc.getAttribute("valuelist");
Date now =new Date();
SimpleDateFormat sdf =new SimpleDateFormat("MM-dd HH:mm");
String min= sdf.format(now);
if(timelist.indexOf(min)==-1){//新的一分钟
timelist.add(min);
valuelist.add(1);
sc.setAttribute("timelist", timelist);
sc.setAttribute("valuelist", valuelist);
}else{
int index =timelist.indexOf(min);
int value=valuelist.get(index);
valuelist.set(index, value+1);
sc.setAttribute("valuelist", valuelist);
}
}
ServletContextListener
实现该接口,在web服务初始化的时候,可以将每分钟的访问量数据list和时间变化的list放在ServletContext对象中作为一个全局变量
ServletContext初始化初始化时的操作:
@Override
public void contextInitialized(ServletContextEvent arg0) {
ServletContext sc = arg0.getServletContext();
List timelist =new ArrayList();
List valuelist =new ArrayList();
sc.setAttribute("timelist", timelist);
sc.setAttribute("valuelist", valuelist);
}
剩下需要做的是有一个页面来显是网站网站访问量的数据,并且实现实时一秒刷新一次,实时显示每分钟的访问量,需要用的到一个servlet,处理网站流量统计界面的后台请求
界面使用白的开源项目echarts来展示数据效果,前台的请求可以用jquery的$.ajax()实现数据交互
servlet如下:
需要用到阿里款的fastjson jar包,实现对象的序列化转成json字符串
@WebServlet(urlPatterns = "/reqt")
public class ReqtServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext sc = req.getServletContext();
List<String> timelist = (List) sc.getAttribute("timelist");
List<Integer> valuelist = (List) sc.getAttribute("valuelist");
Map<String,List> map =new HashMap<String,List>();
map.put("timelist", timelist);
map.put("valuelist", valuelist);
//fastjson 对象序列化
String json =JSON.toJSONString(map);
resp.getWriter().println(json);
}
在数据统计页面引入js文件和画一个图标容器的对象
<script src="js/echarts.min.js"></script>
<script src="js/jquery.3.3.1.min.js"></script>
<body>
<div id="main" style="width: 600px;height:400px;"></div>
</body>
<script type="text/javascript">
function showEchart() {
$.ajax({
url : "/reqt",
type : "get",
dataType : "json",
success : function(json) {
console.log(json);
// 以下这段代码时从echarts官网上复制过来的demo
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title : {
text : '网站访问流量统计'
},
tooltip : {},
legend : {
data : [ '访问量' ]
},
xAxis : {
data : json.timelist
},
yAxis : {},
series : [ {
name : '访问量',
type : 'line',
data : json.valuelist
} ]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
},
error : function() {}
});
}
//js定时器函数,1000是一秒,意思是一秒执行该函数一次
window.setInterval("showEchart()", 1000);
</script>
最终实现的效果如下: