监听器:在java中,是一个实现了特定接口的java类,用来监听另一个java类的方法调用或属性的变更。当被监听的对象发生了上述的事件后,监听器的某个方法就会立即执行
    生活中:类似于汽车上的报警器

    监听器的相关术语
    1、事件源:被监听的对象(汽车)
    2、监听器:正在执行监听的对象(报警器)
    3、绑定监听器:在事件源上绑定监听器(在汽车上安装报警器)
    4、事件:事件源发生改变,被监听器监听到 例如:脚踹汽车、手拍汽车盖
    ** 在程序中,事件对象,封装了事件源对象, 简单讲,就是在事件对象(XxxxxEvent)中,可以得到触法改事件的事件源对象

    Servlet的监听器分为以下三类:
    一类: 监听三个域对象的创建与销毁的监听器
    request, session,servletContext

    1、监听servletContext, 我们发现该对象随着服务器的启动而创建,随着服务器的关闭而销毁,正常关闭服务器,才会触发destroy方法
    2、监听session,
    2.1: 在访问Servlet时,会不会创建session对象呢?
    servlet自身不会创建session,但是可以手动调用请求的getSession()方法来创建session对象
    2.2: 在访问JSP时,会不会创建session对象呢? 一定会创建的
    2.3: 在访问HTML时,会不会创建session对象呢? 一定不会创建

    session对象的创建,是通过请求对象调用getSession()方法,从而创建的

    session对象什么情况下才会销毁呢?
    a、手动调用invalidate方法,销毁session对象
    b、默认情况下,等待30分后,session过期自动销毁
    c、非正常关闭服务器(因为正常关闭服务器,会让HttpSession对象自动钝化到硬盘);

    3、监听request对象都创建和销毁:
    request对象什么时候被创建呢?
    1、访问servlet? 会
    2、访问jsp? 会
    3、访问html? 会,但是必须是访问服务器路径,而不是双击打开
    二类: 监听三个域对象的属性变更的监听器(属性的添加、修改、删除) 即,调用setAttribute,removeAttribute

    三类: 监听HttpSession对象中javabean状态的改变,(绑定与解绑,钝化与活化)
    主要监听Session对象
    1、监听的是javabean的绑定与解绑,而不监听String 或其他基本类型
    2、钝化与活化
    在使用集合装载javabean,钝化时,由于User类没有实现序列化接口,就不允许该类的对象序列化到本地,所以报以下异常
    java.io.NotSerializableException: com.qs.javabean.User


    因为第三类监听器,需要javabean来实现,并且不需要配置到web.xml中

    钝化是解决session自动销毁的问题,因为作为会话级别对象,不能轻易的被销毁,这样会导致有效访问数据的丢失,客户与公司双方体验都很差
    所有为了更好的互联网服务体验,我们建议将所有的javabean进行序列化,当用户退出浏览时,我们设置服务器中的session对象,在用户N分钟内,
    没有继续访问公司的网站,就自动钝化到服务端的磁盘中,进行保存,直到下次客户再次访问本网站后,服务器会自动加载钝化的session及其当中的数据
    ,这个过程叫作活化,用户可以继续访问之前的数据


    刚才我们将JSESSIONID所在的cookie的过期时间进行延长,即便客户关闭浏览器,在过期时间内打开,也不会丢失JSESSIONID,此时我们正常关闭服务器,
    session继续域中的数据,同步被序列化到服务器的磁盘中,再次启动服务器之后,下次客户在cookie过期时间内打开浏览器,访问我们的服务器,
    数据是不会丢失的,会继续保存在session中,但是此时还有个问题,而且很严重的问题,一般来讲,服务器不能随便关闭!但是tomcat默认情况下30分钟会销毁
    session,这也是不好的操作,那么我们可以添加一个配置,用户在指定时间内,没有继续访问我们的服务器,我们就让sesion对象自动钝化到服务器的硬盘中,
    这个配置可以添加在一下三个地方:
    1、tomcat/conf/context.xml :代表所有的项目和所有的虚拟路径都按照这个配置来执行钝化
    2、tomcat/conf/Catalina/localhost/context.xml : 代表所有的localhost主机下的项目都可以按照这个配置来执行钝化
    3、在当前项目下的META-INF/context.xml : 代表只有当前工程按照这个配置进行钝化