监听器学习笔记

1.监听器的定义

  • Servlet规范中定义的一种特殊类
  • 用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件
  • 用于监听域对象的属性发生修改的事件
  • 可以在事件发生前、发生后做一些必要的处理
    监听器学习笔记_第1张图片
    监听器学习笔记_第2张图片

2.第一个实例讲解

2.1 Web监听器的用途

  1. 统计在线人数和在线用户
  2. 系统启动时加载初始化信息
  3. 统计网站访问量
  4. 跟Spring结合

2.2 创建一个监听器的步骤

  1. 创建一个实现监听器接口的类
  2. 配置web.xml进行注册

2.3 监听器的启动顺序

监听器学习笔记_第3张图片

3.监听器的分类

3.1 按照监听的对象划分

监听器学习笔记_第4张图片

3.2 按照监听的事件划分

监听器学习笔记_第5张图片

3.2.1监听对象自身的创建和销毁的事件监听器

监听器学习笔记_第6张图片

3.2.1.1 ServletContextListener

监听器学习笔记_第7张图片
FirstListener .java

public class FirstListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent arg0) {
        //tomcat服务关闭时执行
        String initParam = arg0.getServletContext().getInitParameter("initParam");
        System.out.println("contextDestroyed执行了。。。。:initParam ="+initParam);
    }

    public void contextInitialized(ServletContextEvent arg0) {
        //tomcat服务开启时执行
        System.out.println("contextInitialized执行了。。。。");
    }
}

web.xml

<context-param>
  <param-name>initParamparam-name>
  <param-value>imoocparam-value>
 context-param>

 <listener>
  <listener-class>com.imooc.listener.FirstListenerlistener-class>
 listener>

3.2.1.2 HttpSessionListener

监听器学习笔记_第8张图片
监听器学习笔记_第9张图片

3.2.1.3 ServletRequestListener

监听器学习笔记_第10张图片
监听器学习笔记_第11张图片

3.2.2监听域对象中的属性的增加和删除的事件监听器

监听器学习笔记_第12张图片
监听器学习笔记_第13张图片
监听器学习笔记_第14张图片
监听器学习笔记_第15张图片

3.2.3监听绑定到HttpSession域中的某个对象的状态的事件监听器

监听器学习笔记_第16张图片
监听器学习笔记_第17张图片
监听器学习笔记_第18张图片

4.Servlet3.0下监听器的使用

监听器学习笔记_第19张图片
监听器学习笔记_第20张图片
监听器学习笔记_第21张图片

5.实际项目中常用案例

用监听器实现在线用户人数的统计,并且输出一些用户的信息。
MyHttpSessionListener.java(计算人数)

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    private int userNumber = 0;

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
        userNumber++;
        arg0.getSession().getServletContext()
                .setAttribute("userNumber", userNumber);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
        userNumber--;
        arg0.getSession().getServletContext()
                .setAttribute("userNumber", userNumber);

        ArrayList userList = null;

        userList = (ArrayList) arg0.getSession().getServletContext()
                .getAttribute("userList");
        //如果这个用户存在不,就把这个session所对应的user从userList中移除
        if (SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()) != null) {
            userList.remove(SessionUtil.getUserBySessionId(userList, arg0
                    .getSession().getId()));
            arg0.getSession().setAttribute("userList", userList);
        }
    }

}

MyServletRequestListener .java(获取用户信息)

@WebListener
public class MyServletRequestListener implements ServletRequestListener {

    private ArrayList userList;

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        //arg0.getServletContext().setAttribute("userList", userList);
        userList = (ArrayList) arg0.getServletContext().getAttribute(
                "userList");

        if (userList == null || userList.size() == 0) {
            userList = new ArrayList();
        }

        HttpServletRequest request = (HttpServletRequest) arg0
                .getServletRequest();
        String sessionIdString = request.getSession().getId();
        //如果这个session所对应的用户没有在userList中,就这个用户加入userList中
        if (SessionUtil.getUserBySessionId(userList, sessionIdString) == null) {
            User user = new User();
            user.setSessionIdString(sessionIdString);
            user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .format(new Date()));
            user.setIpString(request.getRemoteAddr());
            userList.add(user);
        }
        arg0.getServletContext().setAttribute("userList", userList);
    }

}

SessionUtil.java(判断这个登录的用户是否是已经登陆的用户)

public class SessionUtil {
    //输入一个userList(用户的集合)和sessionID,遍历userList,查看是否有与这个sessionId匹配的用户,有的话,将这个用户返回
    public static Object getUserBySessionId(ArrayList userList,String sessionIdString) {
        for (int i = 0; i < userList.size(); i++) {
            User user = userList.get(i);
            if (user.getSessionIdString().equals(sessionIdString)) {
                return user;
            }
        }

        return null;
    }
}

index.jsp(显示用户信息)


   

当前用户在线人数

当前用户在线人数:${userNumber}
<% //把userList中的所有用户的信息输出来 // ArrayList userList = (ArrayList)request.getSession().getAttribute("userList");????????? ArrayList userList = (ArrayList)request.getServletContext().getAttribute("userList"); // System.out.println("number============" + userList.size()); if(userList!=null && userList.size() > 0){ for(int i=0;i IP:<%=user.getIpString() %>,
FirstTime:<%=user.getFirstTimeString() %>,
SessionId:<%=user.getSessionIdString() %>
<% } } %>

有待解决的问题:
1. 为啥用户只增不减?
打开两个浏览器,用户数变为2;然后再关闭一个浏览器,说明销毁了一个session,再刷新另外一个浏览器,数量应该变回1才对,可是,结果还是2???
2. 在首页获取用户信息为什么不能用request.getSession().getAttribute,而必须用request.getServletContext().getAttribute???
3. 出现在线人数为空的情况?

你可能感兴趣的:(JAVA学习之路,servlet)