基于java的监听器设计模式总结

本文介绍了监听器设计模式,它是观察者模式的一种实现。在Java Web中,Servlet规范定义了八个监听器接口,用于监听request、session和servletContext对象的生命周期及属性变化。监听器的使用需要在web.xml中注册,例如ServletRequestListener监听request对象的创建和销毁,HttpSessionListener关注session的创建和销毁,以及ServletContextListener关注应用上下文的创建和销毁。

监听器设计模式总结

监听器设计模式,是观察者设计模式的一种实现,它并不是23种设计模式之一。

观察者设计模式
  从现实角度来说,我们每一个人都是一个观察者,同时也是一个被观察者。作为被观察
者,我们会发出一些信息,观察者在接收到这些信息后,会做出相应的反映;而作为观察者, .
我们是可以被“被观察者”所发出的信息影响的。一个被观察者,可能存在多个观察者。也
就是说,一个被观察者所发出的信息,可能会影响到多个观察者。
  观察者设计模式,定义了一种一对多的关联关系。一个对象A与多个对象B、C、D之
间建立“被观察与观察关系”。当对象A的状态发生改变时,通知所有观察者对象B、C、D。
当观察者对象B、C、D在接收到A的通知后,根据自身实际情况,做出相应改变。
当然,观察者与被观察者指的都是具有某一 类功能的对象,所以这里的观察者与被观察
者都是指的接口,而真正的观察者对象与被观察者对象,是指实现了这些接口的类的对象。
   而我们所说的监听器实际对应的就是观察者,而被监听对象,则是指被观察者。
当被监听对象的状态发生改变时也需要通知监听器,监听器在收到通知后会做出相应改变。
与观察者设计模式不同的是,被监听对象的状态改变,被定义为一个对象,称为事件;
被监听对象有了个新的名子,称为事件源,对监听器的通知,称为触发监听器。其实质与观
察者设计模式是相同的。

Servlet规范中的监听器
   Servlet规范中已经定义好了八个监听器接口,它们要监听的对象分别是request. session、
servletContext对象,触发监听器的事件是这三个对象的创建与销毁,它们的域属性空间中
属性的添加、删除、修改,及session的钝化与活化操作。
注意 在JavaWeb项目中使用监听器,需要在web.xml文件中对监听器进行注册

  1. ServletRequestListener
      该监听器用于完成对Request对象的创建及销毁的监听,即当Request对象被创建或被
    销毁时,会触发该监听器中相应方法的执行。
    Request对象创建和销毁
      当客户端浏览器将请求(字符序列)发送到服务器后,服务器会根据 HTTP 请求协议的
    格式对请求进行解析。同时,服务器会创建 HttpServletRequest 的实现类 RequestFacade 的对
    象,即请求对象。然后再调用相应的 set 方法,将解析出的数据封装到请求对象中。此时
    HttpServletRequest 实例就创建并初始化完毕了。也就是说,请求对象是由服务器创建。
    当服务器向客户端发送响应结束后,HttpServletRequest 实例对象被服务器销毁

  2. ServletRequestAttributeListener
      该监听器用于完成对request域属性空间中属性的添加、修改、删除操作的监听。
    销毁时,会触发该监听器中相应方法的执行。

  3. HttpSessionListener
    该监听器用于完成对Session对象的创建及销毁的监听。
    Session对象的创建及销毁

    public HttpSession getSession(boolean create)

      该方法用于创建 Session。若参数 create 为 true,则表示若当前没有 Session,则新建一
    个 Session,若当前存在 Session 则使用当前的 Session。若参数 create 为 false 表示若当前没
    有 Session,则直接返回 null。
      在 web.xml 中可以通过标签设置 Session 的超时时间,单位为分钟。默
    认 Session 的超时时间为 30 分钟。需要再次强调的是,这个时间并不是从 Session 被创建开
    始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的
    时长。若未到超时时限,也可通过HttpSession 中的方法Invalide(),提前使得Session失效。.

    public void invalidate()

  4. HttpSessionAttributeListener
      该监听器用于完成对session域属性空间中属性的添加、修改、删除操作的监听。
    项目:直接在sessionListener项目.上修改

  5. ServletContextListener
      该监听器用于完成对ServletContext 对象的创建及销毁的监听。
    ServletContext 对象的创建及销毁
      由于ServletContext在一 个应用中只有一个,且是在服务器启动时创建。另外,ServletConetxt 的
    生命周期与整个应用的相同,所以当项目重新部署,或Tomcat正常关闭( 通过stop service
    关闭,不能是terminate关闭)时,可以销毁ServletContext。

  6. ServletContextAttribute Listener
    注意在.jsp文件中application是Context

  7. HttpSessionBindingListener
      该监听器用于监听指定类型对象与Session 的绑定与解绑,即该类型对象被放入到
    Session域中,或从Session 域中删除该类型对象,均会引发该监听器中相应方法的执行。
    它与HttpSessionAttributelistener 的不同之处是,该监听器监听的是指定类型的对象在
    Session域中的操作,而HttpSessionAttributeListener监听的是Session 域属性空间的变化,无
    论是什么类型的对象。.
    另外,需要强调两点:
    *该监听器是由实体类实现
    *该监听器无需在web.xml中注册

  8. HttpSessionActivationListener
      该监听器用于监听在Session中存放的指定类型对象的钝化与活化。
    钝化是指将内存中的数据写入到硬盘中(序列化),而活化是指将硬盘中的数据恢复到内存(反序列化。
    当用户正在访问的应用或该应用所在的服务器由于种种原因被停掉,然后在短时间内又重启,此时用户在访问时Session
    中的数据是不能丢掉的,在应用关闭之前,需要将数据写入到硬盘,.
    在重启后应可以立即重新恢复Session中的数据。这就称为Session的钝化与活化。
    那么Session中的哪些数据能够钝化呢?只有存放在JVM堆内存中的实现了 Serializable
    类的对象能够被钝化。也就是说,对于字符串常量、基本数据类型常量等存放在JVM方法
    区中常量池中的常量,是无法被钝化的。
      对于监听Session中对象数据的钝化与活化,需要注意以下几点:
    *实体类除了要实现HttpSessionActivationListener接口外,还需要实现Serializable接口。
    *钝化指的是Session中对象数据的钝化,并非是Session的钝化。所以Session中有几个
    *可以钝化的对象,就会发生几次钝化。
    *HttpSessionActivationListener监听器是不需要在web .xml中注册的。

                          总结自动力节点监听器专题课
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kadyz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值