首页 > 代码库 > 监听器

监听器

Listener监听器

Javaweb开发中的监听器,是用于监听web常见对象

HttpServletRequest HttpSession ServletContext

监听它们的创建与销毁 属性变化 session绑定javaBean

   

1、监听机制

事件 就是一个事情

事件源 产生这个事情的源头

监听器 用于监听指定的事件的对象

注册监听 要想让监听器可以监听到事件产生,必须对其进行注册。

   

------------------------------

2Javaweb开发中常见监听器

2.1、监听域对象的创建与销毁

监听ServletContext创建与销毁 ServletContextListener

监听HttpSession创建与销毁 HttpSessionListener

监听HttpServletRequest创建与销毁 ServletRequestListener

2.2、监听域对象的属性变化

监听ServletContext属性变化 ServletContextAttributeListener

监听HttpSession属性变化 HttpSessionAttributeListener

监听HttpServletRequest属性变化 ServletRequestAttributeListener

   

2.3、监听session绑定javaBean

它是用于监听javaBean对象是否绑定到了session HttpSessionBindingListener

它是用于监听javaBean对象的活化与钝化 HttpSessionActivationListener

3、监听器的快速入门

关于创建一个监听器的步骤

  • 创建一个类,实现指定的监听器接口
  • 重写接口中的方法
    • web.xml文件中对监听器进行注册。

    3.1、关于域对象创建与销毁的演示

  • ServletContext对象的创建与销毁

    这个对象是在服务器启动时创建的,在服务器关闭时销毁的。

    技术分享

  • HttpSession对象的创建与销毁

    HttpSession session=request.getSession();

    Session销毁

    1.默认超时 30分钟

    2.关闭服务器

    3.invalidate()方法

    4.setMaxInactiveInterval(int interval) 可以设置超时时间

    问题:直接访问一个jsp页面时,是否会创建session?

    会创建,因为我们默认情况下是可以在jsp页面中直接使用session内置对象的。

    技术分享

  • HttpServletRequest创建与销毁

    Request对象是发送请求服务器就会创建它,当响应产生时,request对象就会销毁。

    技术分享

       

    3.2、演示了Request域对象中属性变化

    技术分享

    java的监听机制中,它的监听器中的方法都是有参数的,参数就是事件对象,而我们可以通过事件对象直接获取事件源。

    3.3、演示session绑定javaBean

    • javaBean对象自动感知被绑定到session.

      HttpSessionBindingListener 这个接口是由javaBean实现的,并且不需要在web.xml文件中注册.

      技术分享

         

      技术分享

    • javabean对象可以活化或钝化到session中。

      HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器时,session中的javaBean对象就会被钝化到我们指定的文件中。

      当下一次在启动服务器,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中。

      技术分享

      我们还需要个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>

    案例-定时销毁session

  • 怎样可以将每一个创建的session全都保存起来?

    我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.

    将集合List<HttpSession>保存到ServletContext域中。

  • 怎样可以判断session过期了?

    HttpSession中有一个方法public long getLastAccessedTime()

    它可以得到session对象最后使用的时间。

    可以使用invalidate方法销毁。

       

    我们上面的操作需要使用任务调度功能.

    java中有一个Timer定时器类

    技术分享

    关于三个域对象获取

    如果在Servlet中要获取 request,在方法上就有,request.getSession() getServletContext();

       

    如果我们有request对象了, request.getSession() request.getSession().getServletCotnext();

       

    程序在使用时,需要考虑并发问题,因为我们在web中,它一定是一个多线程的,那么我们的程序对集合进行了添加,还有移除操作。

监听器