實現網站訪問人數統計

首先我需要一個能訪問網站人數的功能,那莫具體來講就是需要一個能全局存儲的,在 java web 中 爲啥不用session 因爲他代表的試一次會話是一種局部存儲, 所以用 servletContext 存儲更加合適因爲他是全局的, 可以實現ServletContextListener 接口重寫裏面的2個方法


如果你沒懂我說的他們之前區別可以看看

http://www.cnblogs.com/javadu/archive/2011/11/25/2263799.html

http://www.cnblogs.com/javadu/archive/2011/11/25/2263808.html


 contextDestroyed(ServletContextEvent arg0)

contextInitialized(ServletContextEvent arg0)

在初始化中可以讀取我存儲在磁盤文件那個文件獲取個數 因爲如果不存儲的話 服務器停止他也會沒有了 

在銷燬的方法中我可以拿到存儲在servletcontext中的個數並存儲在文件中,這樣就可以實現存儲保存了

當然這邊的方法是多種的你願意存儲在哪就存在哪,數據庫 其他都可以


廢話了那莫多開始 coding 吧


首先自定義一個我自己的監聽器,然後重寫2個方法,銷燬的方法中是存儲在磁盤的路徑你可以任意指定,但是你存儲在WEN-INF/classes 中他會報沒有訪問權限的錯誤

package com.listener;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("推出");
		ServletContext sc = arg0.getServletContext();
		Counter counter = (Counter) sc.getAttribute("counter");
		if(counter!=null) {
			//String filepath = s
			try {
			//	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter())
			//	PrintWriter pw = new PrintWriter("/count.txt");
				PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("D:\\develop\\apache-tomcat-7.0.67\\webapps\\test\\WEB-INF\\classes\\count.txt")));
				pw.println(counter.getCounter());
				pw.flush();
				pw.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("進入");
		ServletContext sc = arg0.getServletContext();
		System.out.println(sc.getResourceAsStream("/WEB-INF/classes/count.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(sc.getResourceAsStream("/WEB-INF/classes/count.txt")));
		try {
			int count = Integer.parseInt((br.readLine()));
			br.close();
			sc.setAttribute("counter", new Counter(count));
		} catch (NumberFormatException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

然後就是頁面了


<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="com.listener.*"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Counter count = (Counter) this.getServletContext().getAttribute("counter");

		count.setCounter(count.getCounter() + 1);

		this.getServletContext().setAttribute("counter", count);
	%>
	<%=count.getCounter()%>
</body>
</html>

實體類
package com.listener;

public class Counter {
	private int counter;

	public void setCounter(int counter) {
		this.counter = counter;
	}

	public int getCounter() {
		return counter;
	}

	public Counter(int counter) {
		// TODO Auto-generated constructor stub
		this.counter = counter;
	}
}

最後不要忘了在web.xml 中配置listener 中讓我們自定義的起作用

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<listener>
		<listener-class>com.listener.MyListener</listener-class>
	</listener>
	<display-name>Archetype Created Web Application</display-name>
</web-app>


本人不才,希望大神提出指導意見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章