Servlet监听器主要有三种,在ServletContext(上下文对象)、Session(会话)和request(请求)这三对象上进行监听,可以监听对象的创建、销毁、添加属性、删除属性、属性值的改变等。ServletContext对象的作用域在整个WEB应用程序,类似于Static属性;Session的作用域在一个会话,一个会话可以理解为一个从一个浏览器发出请求到服务器开始,一直到浏览器关闭(但通常我们可以设置会话的生命期,防止那些获得连接后却长时间没有再向服务器发出请求的情况),相当于类的成员变量;request的作用域仅在一次请求,即浏览器发送一次请求到服务器处理该请求并发回响应就结束了,相当于局部变量。
要实现统计网站的历史访问量就要利用ServletContext的全局属性的特点了,为了在服务器停止后,之前的访问量不会消失,我们就应该在服务器关闭前将当前的访问量存放到文件里面,以便下一次重启服务器后,可以继续使用。在ServletContext上面创建监听器,监听上下文对象的销毁和创建,并同时在创建上下文的时候从文件读取历史数据,在上下文销毁的时候将当前访问量写入到文件保存起来。以后每当创建一个会话(Session)的时候,就将当前的计数值加一。在线人数的统计是利用在创建会话的时候,将在线人数之加一,在会话对象销毁的时候,将在线人数值减一。因为两种人数统计都是被所有用户共享的信息,所以使用ServletContext的setAttribute()和getAttribut()方法来对总人数和在线人数进行管理。
创建上下文监听器:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class UserCounterListener implementsServletContextListener
{
public void contextDestroyed(ServletContextEventarg0)
{
ServletContext sc =arg0.getServletContext();
Integer count = (Integer)sc.getAttribute("AccessCount");
try
{
PrintWriterout = new PrintWriter(new FileWriter(
"E:\\db\\count.txt"));//将人数保存到文本文件
System.out.println("count:"+ count);
out.print(count);
out.flush();
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public voidcontextInitialized(ServletContextEvent arg0)
{
Integer count = 0;
ServletContext sc =arg0.getServletContext();
try
{
Scanner in =new Scanner(new FileReader("E:\\db\\count.txt"));
// 读取已经产生的人数信息,然后进行累加
count =in.nextInt();
in.close();
}
catch (FileNotFoundExceptione)
{
e.printStackTrace();
}
sc.setAttribute("AccessCount",count);
}
}
在web.xml文件里面进行设置
<listener>
<listener-class>
文件的位置也就是包名.ApplicationListener
</listener-class>
</listener>
再在web.xml设置设定所有HTTP会话的"超时"时间,这里设定为30分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
最后在JSP页面中加入以下代码即可实现:
访问总数:
<%
ServletContextsc = ServletActionContext.getServletContext();
Integercounter = (Integer) sc.getAttribute("AccessCount")+1;
out.print(counter);
sc.setAttribute("AccessCount",counter);
%>