首页 > 技术文章 > Javaweb之监听器的使用

awong18 2020-08-09 19:21 原文

概念:

监听器,简单理解就是监听观察某个事件的发生情况,当被监听的事件发生,事件发生者(事件源) 就会给注册该事件的监听者(监听器)发送消息,将某些信息传递给监听者,同时监听者也可以获得一份事件对象,根据这个对象可以获得相关属性和执行相关操作。

监听器模型涉及以下三个对象,模型图如下:

(1)事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件。

(2)事件源:发生事件的组件就是事件源,也就是被监听的对象。

(3)事件监听器(处理器):监听并负责处理事件的方法。

监听器的实现:

这里举一个例子,显示网站的当前在线人数。要实现这个功能,需要用到session技术,当用户使用浏览器访问某个网站时,马上就会产生一个session的ID,我们只需要统计session的个数,即可获取到当前正在访问该网站的人数。

实现显示网站人数的监听器主要有三个步骤:

  • 编写一个监听类,实现的是HttpSessionListener接口;

  • 在index.jsp中获取并显示数据;

  • 在web.xml中注册监听器。

步骤一:编写一个监听类OnlineCountListener

package listener;
​
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
​
//统计网站在线人数,就是统计session
public class OnlineCountListener implements HttpSessionListener {
​
    //创建session监听,一旦创建就会触发一次这个事件
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        ServletContext context = httpSessionEvent.getSession().getServletContext();
​
        System.out.println(httpSessionEvent.getSession().getId());
​
        Integer OnlineCount = (Integer) context.getAttribute("OnlineCount");
​
        if (OnlineCount==null){
            OnlineCount = new Integer(1);
        }else {
            int count = OnlineCount.intValue();
            OnlineCount = new Integer(count+1);
        }
​
        context.setAttribute("OnlineCount",OnlineCount);
    }
​
    //销毁session监听
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        ServletContext context = httpSessionEvent.getSession().getServletContext();
​
        Integer OnlineCount = (Integer) context.getAttribute("OnlineCount");
​
        if (OnlineCount==null){
            OnlineCount = new Integer(0);
        }else {
            int count = OnlineCount.intValue();
            OnlineCount = new Integer(count-1);
        }
​
        context.setAttribute("OnlineCount",OnlineCount);
    }
​
    /*
    * session的销毁:
    * 手动销毁:getSession().invalidate();
    * 自动销毁:设置过期*/
}
​

在index.jsp中获取并显示数据:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <h1>当前有:<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人在线</h1>
  </body>
</html>

在web.xml中注册监听器:

<!--注册监听器-->
    <listener>
        <listener-class>listener.OnlineCountListener</listener-class>
    </listener>

 

推荐阅读