大量内容来源于:http://www.tuicool.com/articles/bIJJvuE
一,前言
1,什么是web监听器?
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。
2,监听器常用的用途
通常使用Web监听器做以下的内容:
统计在线人数,利用HttpSessionLisener
加载初始化信息:利用ServletContextListener
统计网站访问量
实现访问监控
3,监听器的分类
1)按照监听的对象划分:
ServletContext监控——对应监控application内置对象的创建和销毁。(当web容器开启时,执行contextInitialized方法,当容器关闭或重启时,执行contextDestroyed方法!)
HttpSession监控——对应监控session内置对象的创建和销毁。(当打开一个新的页面时,开启一个session会话,执行sessionCreated方法;当页面关闭session过期时,或者容器关闭销毁时,执行sessionDestroyed方法!)
ServletRequest监控——对应监控request内置对象的创建和销毁。(当访问某个页面时,发出一个request请求,执行requestInitialized方法,当页面关闭时,执行requestDestroyed方法!)
2)按照监听事件划分:
监听事件自身的创建和销毁——同上面的按对象划分。
监听属性的新增、删除和修改——按上面的对象划分,ServletContextAttributeListener接口、SessionAttributeListener接口、ServletRequestAttributeListener接口,分别有attributeAdded方法、attributeRemoved方法、attributeReplaced方法需要去实现。
二,接下来看看一个监听器的创建以及执行过程
1,首先需要创建一个监听器,实现某种接口,例如我想实现一个对在线人数的监控,可以创建如下的监听器:
public class MyListener implements HttpSessionListener{
private int userNumber = 0;
public void sessionCreated(HttpSessionEvent arg0){
userNumber++;
arg0.getSession().setAttribute("userNumber", userNumber);
}
public void sessionDestroyed(HttpSessionEvent arg0){
userNumber--;
arg0.getSession().setAttribute("userNumber", userNumber);
}
}
然后在web.xml中配置该监听器,在web-app中添加:
<listener>
<listener-class>com.test.MyListener</listener-class>
</listener>
在JSP中添加访问人数:
<body>
在线人数:<%=session.getAttribute("userNumber") %><br/>
</body>
2,以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1)执行session.invalidate()方法时 。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户 列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是 这样。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
2)
如果用户长时间没有访问服务器,超过了会话最大超时时间 ,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
三,HttpSessionBindingListener方法的使用
1,捕获Session事件的意义:记录网站的客户登录日志(登录,退出信息等!)
2,Session代表客户的会话过程,客户登录时,往Session中传入一个对象,即可跟踪客户的会话:
在Servlet中,传入Session的对象如果是一个实现HttpSessionBindingListener接口的对象(方便起见,此对象称为监听器),则在传入的时候(即调用HttpSession对象的setAttribute方法的时候)和移去的时候(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)Session对象会自动调用监听器的valueBound和valueUnbound方法。(由此可知,登录日志也就不难实现了!)