监听器

监听器listener在servlet2.5中配置到web.xml中,servlet3.0就可以配置到注解中。

监听器顾名思义,就是监控被监控者的一系列变化。在web应用中监听的就是对象的初始化、销毁、增加、修改、删除值等。
Web监听器是servle规范定义的一种特殊的类,用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件。用于监听域对象的属性增加、删除等事件。用于监听各种事件的发生,可以在这些事件发生前后做一些必要的处理。
 
监听器的启动顺序:
    按照web.xml中配置的先后顺序启动,
 
监听器、过滤器、servlet的启动顺序优先级:listener>filter>servlet。
 
监听器的划分:
    按照监听的对象划分:
        1.监听应用程序环境对象(servletContext)的事件监听器,对应application,需要实现javax.servlet.ServletContextListener接口。
        2.监听用户会话对象(HttpSession)的事件监听器,对应session,需要实现javax.servlet.http.HttpSessionListener接口。
        3.监听用户消息请求对象(ServletRequest)的事件监听器,对应request,需要实现javax.servlet.ServletContextListener接口。
        javax.servlet.ServletContextListener
        javax.servlet.http.HttpSessionListener
    javax.servlet.ServletContextListener
    这三个接口提供了contextInitialized()和contextDestroyed()函数,来监听request、session、application的创建和销毁。
    按照监听的事件类型划分:
        1.监听域对象自身的创建和销毁的事件监听器
        2.监听域对象中属性的创建和销毁的事件监听器
        监听request域对象属性需要实现javax.servlet.ServletRequestAttributeListener接口
    监听session域对象属性需要实现javax.servlet.HttpSessionAttributeListener接口
    监听application域对象属性需要实现javax.servlet.ServletContextAttributeListener接口
    这三个接口提供了attributeAdded()、attributeRemoved()、attributeReplaced()函数,来监听属性添加、属性移除、属性替换函数。
        3.监听绑定到HttpSession域中的某个对象的状态的事件监听器
        保存在session中的对象有多重状态:绑定(session.setAttribute("bean",Object))到session中,从session中解除绑定(session.removeAttribute("bean"));
        随session持久化到设备中,随session从存储设备中恢复。
        servlet规范中定义了两个特殊的监听器接口 HttpSessionBindingListener和HttpSessionActivationListener来帮助javabean来了解自己在session域中的状态,实现这两个接口无需再web.xml中配置。
       属性绑定/解绑到session中:
        实现了HttpSessionBindingListener接口的 JavaBean对象可以感知自己被绑定到 Session中和从Session中删除的事件
    当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的  void valueBound(HttpSessionBindingEvent event) 方法
    当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法
       javax.servlet.http.HttpSessionBindingListener接口:主要包含两个函数:valueBound()和valueUnbound()。
当自身被绑定到session属性中(session.setAttribute("bean",Object))调用valueBound()方法;
   当对象从session中解绑(sesssion.removeAttribute("bean"))的时候调用valueUnbound()函数。
   
    session钝化/激活:
    实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件
活化:javabean对象和Session一起被反序列化(活化)到内存中。
    钝化:javabean对象存在Session中,当服务器把session序列化到硬盘上时,如果Session中的javabean对象实现了Serializable接口
    那么服务器会把session中的javabean对象一起序列化到硬盘上,javabean对象和Session一起被序列化到硬盘中的这个操作称之为钝化
    如果Session中的javabean对象没有实现Serializable接口,那么服务器会先把Session中没有实现Serializable接口的javabean对象移除
    然后再把Session序列化(钝化)到硬盘中
    当绑定到 HttpSession对象中的javabean对象将要随 HttpSession对象被钝化之前,
    web服务器调用该javabean对象对象的 void sessionWillPassivate(HttpSessionEvent event)方法
    这样javabean对象就可以知道自己将要和 HttpSession对象一起被序列化(钝化)到硬盘中
    当绑定到HttpSession对象中的javabean对象将要随 HttpSession对象被活化之后,
    web服务器调用该javabean对象的 void sessionDidActive(HttpSessionEvent event)方法
    这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中
    MyHttpSessionActivationListener接口:主要包含两个函数sessionDidActivate()和sessionWillPassivate()。
    当session超时,会调用sessionWillPassivate()函数,将保存session中的此对象和session一起钝化到硬盘中。
    当再次请求页面,会调用sessionDidActivate()函数,将session和session中保存的对象从硬盘活化到内存中。
 
    测试钝化目录:E:lunaWorkSpace.metadata.pluginsorg.eclipse.wst.server.core mp0workCatalinalocalhostListenerTestgacl
    
 
 
 
 





原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/6473939.html