Servlet监听器主要有三种,在ServletContext(上下文对象)、Session(会话)和request(请求)这三对象上进行监听,可以监听对象的创建、销毁、添加属性、删除属性、属性值的改变等。ServletContext对象的作用域在整个WEB应用程序,类似于Static属性;Session的作用域在一个会话,一个会话可以理解为一个从一个浏览器发出请求到服务器开始,一直到浏览器关闭(但通常我们可以设置会话的生命期,防止那些获得连接后却长时间没有再向服务器发出请求的情况),相当于类的成员变量;request的作用域仅在一次请求,即浏览器发送一次请求到服务器处理该请求并发回响应就结束了,相当于局部变量。
要实现统计网站的历史访问量就要利用ServletContext的全局属性的特点了,为了在服务器停止后,之前的访问量不会消失,我们就应该在服务器关闭前将当前的访问量存放到文件里面,以便下一次重启服务器后,可以继续使用。在ServletContext上面创建监听器,监听上下文对象的销毁和创建,并同时在创建上下文的时候从文件读取历史数据,在上下文销毁的时候将当前访问量写入到文件保存起来。以后每当创建一个会话(Session)的时候,就将当前的计数值加一。在线人数的统计是利用在创建会话的时候,将在线人数之加一,在会话对象销毁的时候,将在线人数值减一。因为两种人数统计都是被所有用户共享的信息,所以使用ServletContext的setAttribute()和getAttribut()方法来对总人数和在线人数进行管理。
创建对上下文对象的监听器:
public class ContextListener implements ServletContextListener{
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
Properties pro = new Properties();
try {
pro.setProperty("counter", arg0.getServletContext().getAttribute("counter").toString());
String filePath = arg0.getServletContext().getRealPath("/WEB-INF/classes/db/count.txt");
//上下文对象销毁时,将当前访问量写入文件
OutputStream os = new FileOutputStream(filePath);
pro.store(os, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
arg0.getServletContext().setAttribute("online", 0);
Properties pro = new Properties();
InputStream in = ContextListener.class.getResourceAsStream("/db/count.txt");
String n = null;
try {
pro.load(in);
n = pro.getProperty("counter");//从计数文件中读取该站的历史访问量
arg0.getServletContext().setAttribute("counter", Integer.parseInt(pro.getProperty("counter")));
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("读取计数文件失败");
}
System.out.println("创建上下文对象" + n);
}
}
创建对会话对象的监听:
public class SessionListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
HttpSession session = arg0.getSession();
int i = (Integer)session.getServletContext().getAttribute("online");//获得当前在线人数,并将其加一
session.getServletContext().setAttribute("online", i+1);
int n = (Integer)session.getServletContext().getAttribute("counter");//创建一个会话就将访问量加一
session.getServletContext().setAttribute("counter", n+1);
Properties pro = new Properties();
try {//访问人数加一后就将结果写入文件(防止不正常关闭服务器)
pro.setProperty("counter", session.getServletContext().getAttribute("counter").toString());
String filePath = session.getServletContext().getRealPath("/WEB-INF/classes/db/count.txt");
OutputStream os = new FileOutputStream(filePath);
pro.store(os, null);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("写入计数文件失败");
}
System.out.println("创建一个会话");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
//销毁会话的时候,需要将在线人数减一
ServletContext context = arg0.getSession().getServletContext();
Integer i = (Integer)context.getAttribute("online");
context.setAttribute("online", i-1);
arg0.getSession().invalidate();
System.out.println("销毁一个会话");
}
}
在web.xml文件中将监听器注册,在创建和销毁对象时就会触发该事件了。 因为我们通常做测试的时候,服务器的关闭是没有通过正常的方式来进行的,所以程序中在创建一个会的时候将网站历史访问数据值加一后就将该值在文件中进行更新,否则可能该值不会改变。创建一个会话是通过request.getSession()来触发的,所以在做测试的Servlet中需要加上HttpSession session = request.getSession();
//设置会话的最大不活动时间为60秒
session.setMaxInactiveInterval(60);。
分享到:
相关推荐
servlet,监听器,javaservlet,监听器,java
servlet监听器案例,web.xml,加jsp,listener的配置和使用
servlet过滤器和监听器,servlet过滤器和监听器课件,servlet过滤器和监听器PPT
统计在线人员 人员登陆
实验1: 利用servlet实现一个简单的聊天室 实验目的 (1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术实现一个简单的聊天室,实现多人同时交流。当发送聊天信息时,信息...
Servlet监听器的概念 各种类型的Servlet事件监听器的使用方法 监听器的配置方法
关于Servlet监听器的几个例子,用于统计在线人数等等
NULL 博文链接:https://leiwuluan.iteye.com/blog/361234
本资源用于servlet事件监听器和JSP基础学习,非常适合新手学习
第13章使用Servlet过滤器和监听器,基础知识
主要为大家详细介绍了java web用servlet监听器实现显示在线人数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
通过在网上浏览,总结有关servlet监听器的一些内容
servelt 监听器 class MyRequest extends HttpServletRequestWrapper { public MyRequest(HttpServletRequest request) { super(request); } public String MyEncoding(String value) { String value...
NULL 博文链接:https://1601844782.iteye.com/blog/2274209
详见 http://www.cnblogs.com/xiaoduc-org/p/5400420.html
+servlet+java 实现统计在线人数,在线用户.txt
JAVA Servlet监听器listener学习资料,精心整理,望对各位大虾有帮助。
用DAO模式设计,servlet,监听器统计在线人数 动态数据库查询方法,是一个学习的好材料。
Servlet过滤器与监听器