`

Web监听器(转)

阅读更多

大量内容来源于: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方法。(由此可知,登录日志也就不难实现了!)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics