监听器


                                                        
    监听器

        一、概述:监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用或者属性的改变。
        
              当被监听对象发生上述事件后,监听器某个方法将会立即被执行。


        二、监听器的术语:
        
                事件源:指的是被监听对象(汽车)
                监听器:指的是监听的对象(报警器)
                事件源和监听器绑定:在汽车上安装报警器
                事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。

                
        三、servlet中的监听器:

            在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和
            
            ServletRequest这三个域对象。
            

            Servlet中的监听器的分类:
            
                一类:监听三个域对象的创建和销毁的监听器(三个)
                二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
                三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

            一类:
            
                1、servletContextListener监听器的使用:

                    1、作用:用来监听ServletContext域对象的创建和销毁的监听器。

                    2、servletContext创建和销毁

                        1、创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
                        
                              相应的servletContextListener监听器的方法:
                              
                                --- contextInitialized(ServletContextEvent sce);   用于监听servletcontext对象的创建;
                                
                        2、销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。
                        
                               相应的servletContextListener监听器的方法:
                               
                                 --- contextDestroyed(ServletContextEvent sce);    用于监听servletcontext对象的销毁;
                                 
                                 
                        3、使用方式:
                        
                            1、自定义一个监听器的类,然后实现ServletContextListener类;
                            
                            2、重写ServletContextListener类中的方法,见上面的两个方法;
                            
                            3、在web.xml文件中配置:
                            
                                <listener>
                                
                                    <listener-class>自定义监听器类的全类名</listener-class>
                                
                                </listener>
                                
                            4、当我们的项目启动时,就会创建一个servletcontext对象,相应的就会执行自定义类中的监听方法;
                    
                    
                2、HttpSessionListener监听器的使用:
                
                    1、作用:用来监听HttpSession对象的创建和销毁。
                    
                    2、httpsession的创建和销毁:
                    
                        1、创建:服务器端第一次调用getSession()方法时候。
                        
                            相应的HttpSessionListener监听器的方法:
                            
                            --- sessionCreated(HttpSessionEvent se);    用于监听HttpSession对象创建
                            
                        2、销毁:
                                1、非正常关闭服务器(正常关闭服务器session会被序列化)。
                                2、Session过期(默认过期时间30分钟)。
                                3、手动调用session.invalidate()方法。
                                
                                相应的HttpSessionListener监听器的方法:
                                
                                --- sessionDestroyed(HttpSessionEvent se); 监听HttpSession对象销毁
                                
                        3、使用方式:同上。实现的接口和重写的方法不同。
                        
                        4、问题:
                        
                            访问HTML是否创建Session        :不会
                            访问JSP是否创建Session        :会
                            访问Servlet是否创建Session    :不会(默认没有调用getSession方法)
                                                            
                                                            
                3、ServletRequestListener监听器的使用:

                    1、作用:用户监听ServletRequest对象的创建和销毁    

                    2、ServletRequest对象的创建和销毁:

                        1、创建:从客户端向服务器发送一次请求,服务器就会创建request对象。

                            相应的ServletRequestListener监听器的方法:

                            --- requestInitialized(ServletRequestEvent sre);    监听ServletRequest对象的创建                        
                                                            
                        2、销毁:服务器对这次请求作出了响应之后,request对象就销毁了。

                            相应的ServletRequestListener监听器的方法:

                            --- requestDestroyed(ServletRequestEvent sre);        监听ServletRequest对象的销毁                    
                                                            
                        3、使用方式:同上。实现的接口和重写的方法不同。

                        4、问题:
      
                                访问HTML页面是否创建请求对象    :会
                                访问JSP页面是否创建请求对象        :会
                                访问Servlet是否创建请求对象        :会  
                                                        
                                                        
                                                        
            二类:监听三个域对象的属性变更的监听器
                
                1、ServletContextAttributeListener    监听ServletContext对象中的属性变更(属性添加,移除,替换)的监听器    

                    相应的方法:

                        --- attributeAdded(ServletContextAttributeEvent scab);    

                        --- attributeRemoved(ServletContextAttributeEvent scab);

                        --- attributeReplaced(ServletContextAttributeEvent scab);

                2、HttpSessionAttributeListener     监听HttpSession对象中的属性变更(属性添加,移除,替换)的监听器

                    相应的方法:

                        --- attributeAdded(HttpSessionBindingEvent se);    

                        --- attributeRemoved(HttpSessionBindingEvent se);

                        --- attributeReplaced(HttpSessionBindingEvent se);
                     
                3、ServletRequestAttributeListener  监听ServletRequest对象中的属性变更(属性添加,移除,替换)的监听器
                            
                    相应的方法:

                        --- attributeAdded(ServletRequestAttributeEvent srae);    

                        --- attributeRemoved(ServletRequestAttributeEvent srae);

                        --- attributeReplaced(ServletRequestAttributeEvent srae);、

                        
                                                        
            三类:监听HttpSession中Java类状态改变的监听器

                1、概述:

                        保存在Session域中的Java类可以有多种状态:绑定到session中;从session中解除绑定;
                        
                        随session对象持久化到一个存储设备中(钝化);随session对象从一个存储设备中恢复(活化)。
                        
                        Servlet对方中定义了两个特殊的监听的接口来帮助Java类了解自己在Session域中的状态:
                        
                            HttpSessionBindingListener接口
                            HttpSessionActivationListener接口,
                            
                            实现这两个接口的类不需要在web.xml中进行配置。    

                    1、HttpSessionBindingListener监听器:     
    
                        HttpSessionBindingListener接口:用来监听Java类在HttpSession中的绑定和解除绑定的状态的监听器:(绑定必须是java对象 才是绑定)

                        valueBound(HttpSessionBindingEvent event);绑定监听器

                        valueUnBound(HttpSessionBindingEvent event);解除绑定监听器

                         绑定也是用set ,解除绑定用remove
                         

                    2、HttpSessionActivationListener监听器

                        监听HttpSession中Java类的钝化和活化监听器。(大白话来说,也就是将保存到session中的数据序列化保存到
                        
                        本地服务器上,形成一个文件,反之活化,也就是在我们需要用到session中的数据的时候,将保存与本地服务器
                        
                        上的文件反序列化,保存到session中,以便我们调用。)

                        sessionDidActivate(HttpSessionEvent se); 活化监听器

                        sessionWillPassivate(HttpSessionEvent se); 钝化监听器 需要实现序列化接口

 

                        测试代码:

                                       监听器
                         

                        配置完成session的序列化和反序列化

                        Context标签可以配置在:

                        tomcat/conf/context.xml  :所有tomcat下虚拟主机和虚拟目录下的工程都会序列化session

                        tomcat/conf/Catalina/localhost/context.xml :localhost虚拟主机下的所有项目会序列化session

                        工程/META-INF/context.xml :当前工程才会序列化session。

                         

                        <Context>

                        <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">

                        <Store className="org.apache.catalina.session.FileStore" directory="javaee"/>

                        </Manager>

                        </Context>