一.监听器Listener
1.1 Listener的作用
Listener是一个功能组件,在创建、销毁或添加、修改或删除应用程序、会话和请求对象的属性时自动执行代码。
监听器是servlet的监听器,它可以监听客户端的请求和服务器的操作。
可以使用application,session,request这三个对象
1.2 小demo之统计在线人数
1.新建omline,继承类HttpSessionListener,重写sessionCreated和sessionDestroyed方法:
public class omline implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
}
public void sessionDestroyed(HttpSessionEvent se) {
}
}
2.对于sessionCreated方法:
创建Session监听,可以查看用户的一举一动。一旦创建Session就会触发这个方法!
对于sessionDestroyed方法:
销毁session监听。一旦销毁Session就会触发这个方法!
3.创建servletContext对象,新建OnlineCount键值对。
ServletContext servletContext = se.getSession().getServletContext();
Integer omlinecount = (Integer) servletContext.getAttribute("OnlineCount");
判断当前在线人数,如果omlinecount为空的话,更新当前的在线人数为1。
if(omlinecount==null){
omlinecount=new Integer(1);
}
如果现在人数不为空的话,将当前的人数加一。
else{
int count = omlinecount.intValue();
omlinecount=new Integer(count+1);
}
将当前人数存入键值对:
servletContext.setAttribute("OnlineCount",omlinecount);
4.销毁session监听:
前面的代码基本一样,唯一不同的是,对于空值的判断和非空的人数计算。
对于当前对象为空时,将其赋值为0。
if(omlinecount==null){
omlinecount=new Integer(0);
}
当其不为0时,将其人数减一:
else{
int count = omlinecount.intValue();
omlinecount=new Integer(count-1);
}
5.注册监听器,注册监听器只需要一句话,如下:
<listener>
<listener-class>main.java.omline</listener-class>
</listener>
6.在访问的主页面写下jsp语句,引入java对象的值,实现输出当前的在线人数。
当前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%>人在线</span>
7.启动服务器,访问主页,得到结果如下:
1.3 统计结果错误原因分析
寻找原因,找到omline里的sessionCreated方法,写一下输出所有Session的ID
System.out.println(se.getSession().getId());
运行项目,观察输出台:
9DF74823455F36EDA429B31938B5EEE5
2D248509C732D5C448DA1E57BE539E97
打开F12,网络查看该用户的Session:
可以看到,现在的Session是控制台输出的最后一个,说明第一个链接失败,已经被销毁了。
如果我们重新发布改页面:
刷新改页面,继续打开Session观察如下:现在就变为了一人!
注意:
如果我们使用一个游览器两个页面都访问该路径,还是属于一个任务的,在线人数算做一人。
如果我们打开不同的游览器来访问该url,这个这时候就会算做不同的用户,分配不同的Sessionid给用户。
步骤:
1.实现监听器的接口。重写里面的方法!
2.配置监听器(xml里注册监听器)。