关闭

Java Web开发--------监听器

标签: 监听器java web
224人阅读 评论(0) 收藏 举报
分类:

一. 监听器的基本概念

监听器是Servlet规范定义的一种特殊类,

  • 用于监听ServletContext,HttpSession和ServletRequest等域对象的创建和销毁事件
  • 用于监听对象的属性发生修改的事件

可以在事件发生前,发生后做一些必要的处理。

监听器常用在统计在线人数,统计网站访问量,系统启动时加载初始化信息等上面。

监听器,过滤器,Servlet的优先级,即加载顺序是依次递减的


二. 监听器的分类

有监听ServletContext,HttpSession和ServletRequest三大类,三大类中每一类又分为

  • 监听域对象自身的创建,销毁
  • 监听域对象中的属性的增加和删除

HttpSession还有个监听绑定到该域中的某个对象(上面是属性)的状态的事件监听器HttpSessionBindingListener,HttpSessionActionListener,在Eclipse中创建Listener时的对话框很好地体现了这一分类结构
这里写图片描述


三. 使用步骤

  1. 定义Listener类,实现需要的接口
  2. 在web.xml中配置相应的Listener
    • 使用注解@WebListener(servlet3可用)
    • HttpSessionBindingListener,HttpSessionActionListener不需要再web.xml中注册

四. 案例:统计在线人数和记录相应的IP

一个Session对应一人,
IP地址在Session中获取不到,只能在request中获取,两者通过往ServletContext()中setAttribute来交互

SessionListener类:

public void sessionCreated(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        userNum ++;
        arg0.getSession().getServletContext().setAttribute("userNum", userNum);
    }

    /**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        userNum --;
        HttpSession session = arg0.getSession();
        session.getServletContext().setAttribute("userNum", userNum);

        ArrayList<User> users = (ArrayList<User>) session.getServletContext().getAttribute("users");
        users.remove(SessionUtil.getUserById(users, session.getId()));
    }

RequestLisenter类:

public void requestInitialized(ServletRequestEvent arg0) {
        // TODO Auto-generated method stub
        HttpServletRequest request =  (HttpServletRequest) arg0.getServletRequest();
        String sessionId = request.getSession().getId();

        if(SessionUtil.getUserById(users, sessionId) == null) {
            User u = new User();
            u.setFirstTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            u.setIp(request.getRemoteAddr());
            u.setSessionId(sessionId);
            users.add(u);
        }

        request.getSession().getServletContext().setAttribute("users", users);
    }

jsp视图:

<body>
    ${userNum} online<br>

    <% ArrayList<User> users = (ArrayList<User>)application.getAttribute("users"); 
        System.out.println(users.size());
        for(User u : users) {
    %>
        IP: <%=u.getIp() %><br>
        sessionId: <%=u.getSessionId() %><br>
        firstTime: <%=u.getFirstTime() %><br>
    <%

        }
    %>
</body>
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场