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>
最終實現的效果如下: