ServletRequestListener
ServletRequestListener接口能监听每一个request的请求的创建和销毁,用来记录网站的浏览量非常合适,可以按照每一分钟来统计有多少request请求,请求产生的数据技术则可以放在ServletContext全局对象中进行设置和读取
实现requestInitialized()方法
@Overridepublic void requestInitialized(ServletRequestEvent arg0) {HttpServletRequest hsr= (HttpServletRequest)arg0.getServletRequest();//过滤统计请求,避免多计算String url= hsr.getRequestURL().toString();if(url.endsWith("/reqt")){return;}//获取ServletContextServletContext 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初始化初始化时的操作:
@Overridepublic 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 {@Overrideprotected 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官网上复制过来的demovar 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>
最终实现的效果如下: