JavaWeb-Listener

监听器概念

指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动。

Web监听器是Servlet规范中定义的一种特殊类。

Web监听器可以监听客户端的请求和服务端的操作,可监听三大对象application(ServletContext)、session(HttpSession)、request(ServletRequest)的创建、销毁以及监听域对象的属性发生修改的事件,并可在发生前后做一些相应的处理。

Web监听器的用途:统计在线人数和访问量、系统启动时加载初始化信息、跟Spring结合。

启动顺序:按照web.xml文件中注册的顺序。

优先级:监听器>过滤器>Servlet

在web.xml中注册:

<listener>
    <listener-class>com.seu.sun.TestServletContextListener</listener-class>
</listener>

 

ServletContextListener

对ServletContext对象监听,主要用途:定时器、全局属性对象。

public class TestServletContextListener implements ServletContextListener{
    @Override
    //ServletContext创建时调用
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized");
        //可以设置全局属性
        //servletContextEvent.getServletContext();获得ServletContext对象
        //web.xml<context-param>标签中定义的全局变量
        String s = servletContextEvent.getServletContext().getInitParameter("initParam");
        System.out.println(s);
    }

    @Override
    //ServletContext销毁时调用
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed");
    }
}

HttpSessionListener

主要用途:统计在线人数、记录访问日志。

public class TestHttpSessionListener implements HttpSessionListener {
    private int userNumber;
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        httpSessionEvent.getSession();//获得session对象
        userNumber++;
        //每次登陆产生会话,记录在线人数 httpSessionEvent.getSession().getServletContext().setAttribute("userNumber",userNumber);
        System.out.println("sessionCreated");
        System.out.println(new Date());
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDestroyed");
        System.out.println(new Date());
    }
}

ServletRequestListener

主要用途:读取参数、记录访问历史

public class TestServletRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("requestDestroyed");
        try {
            servletRequestEvent.getServletRequest().setCharacterEncoding("UTF8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String a = servletRequestEvent.getServletRequest().getParameter("a");
        System.out.println(a);
    }

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

 

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

三个对象分别实现下面三个接口:

ServletContextAttributeListener

HTTPSessionAttributeListener

ServletRequestAttributeListener

每个接口的实现需要实现三个方法:

attributeAdded

attributeRemoved

attributeReplaced

如:

public class TestServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {}
    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {}
    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {}
}

 

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

HttpSession中对象状态:

绑定——》解除绑定,set,remove属性

绑定监听实现HttpSessionBindingListener接口

 

钝化——》活化,session钝化机制,将不常用的Session序列化到磁盘上,使用时再反序列化。

Session钝化机制由SessionManager管理

钝化活化监听实现HttpSessionActivationListener接口

这两个监听器不需要在web.xml中注册,将对应的对象实现对应的接口,则该对象被绑定、解绑、钝化、活化时将被监听。

public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {

    private String username;
    private String password;

    public void valueBound(HttpSessionBindingEvent httpsessionbindingevent) {
        System.out.println("valueBound:" + httpsessionbindingevent.getName());
    }

    public void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent) {
        System.out.println("valueUnbound:" + httpsessionbindingevent.getName());
    }

    public void sessionWillPassivate(HttpSessionEvent httpsessionevent) {
        System.out.println("sessionWillPassivate:" + httpsessionevent.getSource());
    }

    public void sessionDidActivate(HttpSessionEvent httpsessionevent) {
        System.out.println("sessionDidActivate:" + httpsessionevent.getSource());
    }
}

 

Servlet3.0下监听器用法,注解

@WebListener,该注解用于将类声明为监听器,被该注解标注的类必须实现一个监听器的接口,免去在web.xml中注册。注解方法无法定义顺序(web.xml中按照注册顺序)

 

慕课学习笔记:https://www.imooc.com/learn/271

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值