Listener监听器

来源:互联网 发布:淘宝千牛客服怎么设置 编辑:程序博客网 时间:2024/06/07 19:32
A:
    Listener监听器:
        1:javaweb开发中的监听器,用于监听web常见对象:HttpServletRequest、HttpSession,ServletContext,
          监听他们的创建与销毁,属性变化,session绑定javaBean

        2:监听机制:
            事件:就是一个发生在事件源上的一个事件
            事件源:产生这个事情的源头
            监听器:用于监听指定的事件的对象
            注册监听:要想让监听器可以监听到事件产生,必须对其进行注册(一般是实现要监听对象的接口)

        3:监听域对象的创建与销毁
            监听ServletContext创建与销毁,实现的接口是:ServletContextListener
            监听HttpSession创建与销毁,实现的接口是:HttpSessionListener
            监听HttpServletRequest创建与销毁,实现的接口是:ServletRequestListener

        4:监听域对象的属性变化
            监听ServletContext属性变化,实现的接口是:ServletContextAttributeListener
            监听HttpSession属性的变化,实现的接口是:HttpSessionAttributeListener
            监听HttpServletRequest属性变化,实现的接口是:ServletRequestAttributeListener

        5:监听Session绑定javaBean
            用于监听javaBean对象是否绑定到了session域,实现的接口是:HttpSessionBindingListener
            用于监听javBean对象的活化与钝化,实现的接口是:HttpSessionActivationListener

        6:创建一个监听器的步骤
            (1)创建一个类,实现指定的监听器接口
            (2)重写接口中的方法
            (3)在web.xml文件中对监听器进行注册,例如:<listener>
                                                             <listener-class>com.itheima.test.MyServletContextListener</listener-class>
                                                       </listener>


B:关于域对象创建与销毁的演示代码
        1:ServletContext对象的创建与销毁
         
注:这个对象是在服务器启动时创建的,在服务器关闭时销毁的
            public class MyServletContextListener implements ServletContextListener{

                public void contextInitialized(ServletContextEvent sce){
                    system.out.println("servletContext对象被创建了");
                }

                public void contextdestroyed(servletContext  sce){
                    system.out.println("servletContext对象被销毁了");
                }

            }




        2:HttpSession对象的创建与销毁
            HttpSession  session=request.getSession();
            Session销毁:
                1:默认超时(30分钟)
                2:关闭服务器
                3:invalidate()方法//使session销毁
                4:setMaxInactiveInterval(int interval)可以设置超时时间
        注:session对象是一个jsp内置对象,他在第一个jsp页面被装载时自动创建,完成会话期管理
        从一个客户打来浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为
        一个会话;当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器
        应当通过某种方法知道这是同一个客户,就需要session对象
           
public class MyHttpSessionListener implements HttpSessionListener{

                public void sessionCreated(HttpSessionEvent se){
                    system.out.println("创建session对象");
                }

                public void sessionDestroyed(HttpSessionEvent se){
                    system.out.println("销毁了session对象");
                }
            }



        3:HttpServletRequest创建与销毁
          Request对象是发送请求服务器就会创建它,当响应产生时,request对象就会销毁
           
public class MyRequestListener implements ServletRequestListener{

                public void requestDestroyed(ServletRequestEvent  sre){
                    System.out.println("request对象销毁了");
                }

                public void requestInitialized(ServletRequestEvent sre){
                    System.out.println("request对象创建了");
                }
            }



C:关于Request域对象中的属性变化
    1:监听HttpServletRequest的属性的添加,修改,删除
       
public class TestHttpServletRequestAttribute implements ServletRequestAttributeListener{
            public void attributeAdded(ServletRequestAttributeEvent  srae)
            {
                System.out.println("HttpServletRequest添加了数据了");
            }

            public void attributeRemoved(ServletRequestAttributeEvent  sra)
            {
                System.out.println("HttpServletRequest删除了数据");
            }

            public void attributeRequestReplaced(ServletRequestAttributeEvent srae)
            {
                System.out.println("HttpServletRequest替换了了数据");
                System.out.println("替换了属性:"+srae.getName());
            }
        }

        注:在java的监听机制中,它的监听器方法都是有参数的,参数就是事件对象,我们可以通过事件来得到事件源


D:关于Session对象的监听       
    1:关于session绑定javaBean对象
        (1)javaBean对象自动感知被绑定到session中
        HttpSessionBindingListener这个接口是由javaBean实现的,并且不需要在web.xml文件中注册
           
public class User implements Serializable,HttpSessionBindingListener{

                public void valueBound(HttpSessionBindingEvent event){
                    System.out.println("向session中绑定了一个user对象");
                }

                public void valueUnbound(HttpSessionBindingEvent  event){
                    System.out.println("从session中将user对象移除了");
                }
            }


        (2)在jsp中的代码如下:
        <%
            User user=new User();
            user.setId(1);
            user.setUsername("tom");
            user.setPassword("123");
            user.setRole("admin");

            //绑定到session
            session.setAttribute("user",user);

            //解除绑定
            session.removeAttribute("user");

        %>


    2:javaBean对象可以活化或钝化到session中
    HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器的时候,session中的javaBean
    对象就会被钝化到我们指定的文件中,当下一次再启动服务器的时候,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中

    
    public class User implements Serializable,HttpSessionBindingListener,
                HttpSessionActivationListener{

            public void sessionWillPassivate(HttpSession  se){
                System.out.println("钝化");
            }

            public void sessionDidActivate(HttpSessionEvent  se){
                System.out.println("活化");
            }
        }

        我们还需要个context.xml文件来配置钝化时存储的文件,在meta-inf目录下创建一个context.xml文件
            <Context>
                <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
                    <Store className="org.apache.catalina.session.FileStore" directory="it315"/>
                </Manager>
            </Context>


    3:对于定时销毁session对象的步骤:
        (1):怎样可以将每一个创建的session全都保存起来?
            我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.
            将集合List<HttpSession>保存到ServletContext域中。

        (2):怎样可以判断session过期了?
            在HttpSession中有一个方法public long getLastAccessedTime()
            它可以得到session对象最后使用的时间。
            可以使用invalidate方法销毁。


    4:创建session和销毁闲置sesison
        (1)创建session对象时,就会被放在ServletContext里面的集合当中,代码如下:
          
  public class TestHttpSessionListener implements HttpSessionListener{

                //当HttpSession被创建时,放入到ServletContext中的集合
                public void sessionCreated(HttpSessionEvent se){

                    //把HttpSession对象放入到List
                    HttpSession session=se.getSession();
                    //得到ServletContext对象
                    ServletContext application=session.getServletContext();
                    //从ServletContext中得到List集合
                    List<HttpSession> list=(List<HttpSession>)application.getAttribute("sessions");
                    list.add(session);
                    System.out.prinln("添加了session:"+session.getId());

                }

                public void sessionDestroyed(HttpSesisonEvent se){

                }
            }


        (2)监视ServletContext对象,当被创建的时候会创建存储session对象的集合,代码如下:
           
            //监听ServletContext,当ServletContext对象被创建时,创建存储HttpSession对象 的集合
            public class TestServletContextListener implements ServletContextListener {

                public void contextInitialized(ServletContextEvent sce) {
                    //创建List集合,放在匿名内部类中变量要使用final修饰
                    final List<HttpSession> list = new ArrayList<HttpSession>();
                    //把集合放到ServletContext对象中
                    ServletContext application = sce.getServletContext();

                    application.setAttribute("sessions", list);

                    //定时的扫描集合,把超时的session销毁
                    Timer timer = new Timer();

                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            System.out.println("开始扫描。。。。。");
                            for(Iterator<HttpSession> ite = list.iterator();ite.hasNext();){
                                HttpSession session = ite.next();
                                long t = System.currentTimeMillis()-session.getLastAccessedTime();
                                if(t>3000)
                                {
                                    System.out.println("销毁了一个session:"+session.getId());
                                    session.invalidate();//销毁
                                    ite.remove();
                                    //list.remove(session);//从集和中删除该session对象,但集合内部不能自己的元素进行增删操作
                                }
                            }
                        }
                    }, 2000, 5000);

                }

                public void contextDestroyed(ServletContextEvent sce) {

                }

            }


























0 0