web监听器

web监听器的定义;

web监听器是servlet规范中定义的一种特殊类;

用于监听servletContext(application) 、 HttpSession (session)、ServeletRequest (request)等域对象的创建与销毁事件;

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

  ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。  由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

在Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。

可以在事件发生前、发生后做一些必要的处理;用于监听域对象的属性发生修改的事件;

web监听器的用途;

1.统计在线人数和在线用户;

2.系统启动时加载初始化信息;

3.统计网站访问量;

4.跟SPring结合;

第一个web监听器;

步骤:1.创建一个实现监听器接口的类;2.配置web.xml 进行注册;(点击desgin)然后选中Lister,之后把实现的类路径选中,就好了

 按监听的对象划分:

1.用于监听应用程序环境对象(ServletContext)的事件监听器;

2.用于监听用户会话对象(HttpSession)的事件监听器;

3.用于监听请求消息对象(ServletRequset)的事件监听器;

按监听的事件划分:

1.监听域对象自身的创建和销毁的事件监听器;

2.监听域对象的属性的增加和删除监听器;

3.监听绑定到HttpSession域的某个对象的事件监听器;

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

在servlet规范中呢,定义了三个接口,分别是ServletContextListener HttpSessionLister ,ServletRequestLister来监听ServletContext,HttpSession,ServletRequset

对象的创建和销毁;

1.ServletContext的创建和销毁:

ServletContext实现了ServletContextListener 这个接口;来监听这个对象的创建和销毁;

ServletContextListener 有两个方法:

public void contextInitialized(ServletContextEvent sce)

ServletContext创建时调用;

public vod contextDestoryed(ServletContextEvent sce)

ServletContext销毁时调用;

事例代码:

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("contextDestroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("contextInitialized");
    }

}
View Code

2.HttpSession的对象创建与销毁;

HttpSession实现了HttpSessionLister 这个接口;来监听这个对象的创建和销毁;

HttpSessionLister有两个方法:

public void sessionCreated(HttpSessionEvent sce)

Session创建时调用;

public vod sessionDestroyed(((HttpSessionEvent sce);

Session销毁时调用; 用途:统计访问人数;记录访问日志;

session创建的时间,当用户打开浏览器,第一次访问我们的网站的时候,这个时候,session对象就会被创建;可以在session保存一些信息;

销毁session对象:有三种方法;1.手动的点击退出的时候,程序会去调用销毁的方法,2,当关闭浏览器的时候,session对象也会被销毁。3,没有关闭浏览器,

但是会话超时了,这个时候session对象也会被销毁;

我们可以在web.xml中配置

<session-config>
    <time-out>1</time-out>
</session-config>
View Code

事例代码:

package com.imooc.listener;

import java.util.ArrayList;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.imooc.entity.User;
import com.imooc.util.SessionUtil;
@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<User> userList = null;//在线用户List
        
        userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");
        
        if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){
            userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));
        }
        
    }

}
View Code

ServletRequest实现了ServletRequestListener 接口;

public void requestDestroyed(ServletRequestEvent arg0) 

Request创建时调用;

public void requestInitialized(ServletRequestEvent arg0)

Request销毁时调用; 用途:读取参数;记录访问历史;

事例代码:

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;


@WebListener
public class MyServletRequestListener implements ServletRequestListener {

    
    
    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
            System.out.println("fff");
    }
    

}
View Code
原文地址:https://www.cnblogs.com/zht0915/p/4688854.html