监听器-Listener

Servlet规范中的监听器-Listener

  • 观察者设计模式, 所有的监听器都是观察者设计模式的体现。

  • 什么是观察者设计模式呢?

    • 它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时,触发事件。

  • 观察者模式通常由以下三部分组成:

    • 事件源:触发事件的对象。

      • ​ 事件:触发的动作,里面封装了事件源。

      • ​ 监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。

监听器作用:

在开发项目中,我们可以对:对象的创建销毁、域对象中的属性变化、会话中相关的内容进行监听 ​ 在servlet规范中共计8个监听器,监听器都是以接口形式提供的,具体功能需要我们自己来完成

1.1 监听对象创建的监听器

ServletContextListener:用于监听ServletContext对象创建和销毁的监听器

核心方法:

返回值方法名作用
voidcontextInitialized(ServletContextEvent sce)对象创建时执行此方法
voidcontextDestroyed(ServletContextEvent sce)对象销毁执行此方法
  • 参数ServletContextEvent代表事件对象,事件是【创建对象】这个动作

  • 事件对象中封装着触发事件的来源,即事件源,就是ServletContext

  • 真正的事件指的是创建或销毁ServletContext对象的操作

/**

用于监听ServletContext对象创建和销毁的监听器

@since v 2.3
*/

public interface ServletContextListener extends EventListener {

/**

对象创建时执行此方法。该方法的参数是ServletContextEvent事件对象,事件是【创建对象】这个动作

事件对象中封装着触发事件的来源,即事件源,就是ServletContext
*/
public default void contextInitialized(ServletContextEvent sce) {
}

/**

对象销毁执行此方法
*/
public default void contextDestroyed(ServletContextEvent sce) {
}

}

HttpSessionListener:用于监听HttpSession对象创建和销毁的监听器

核心方法:

返回值方法名作用
voidcsessionCreated(HttpSessionEvent se)对象创建时执行此方法
voidsessionDestroyed(HttpSessionEvent se)对象销毁执行此方法
  • 参数HttpSessionEvent 代表事件对象

  • 事件对象中封装着事件源,就是HttpSession

  • 真正的事件指的是创建或销毁HttpSession对象的操作

public interface HttpSessionListener extends EventListener {

/**

对象创建时执行此方法。
*/
public default void sessionCreated(HttpSessionEvent se) {
}

/**

对象销毁执行此方法
*/
public default void sessionDestroyed(HttpSessionEvent se) {
}

}

ServletRequestListener:用于监听ServletRequest对象创建和销毁的监听器

返回值方法名作用
voidrequestInitialized (ServletRequestEvent sre)对象创建时执行此方法
voidrequestDestroyed (ServletRequestEvent sre)对象销毁执行此方法
public interface ServletRequestListener extends EventListener {

/**

对象创建时执行此方法。
*/
public default void requestInitialized (ServletRequestEvent sre) {
}

/**

对象销毁执行此方法
*/
public default void requestDestroyed (ServletRequestEvent sre) {
} 

}

1.2监听域中属性发生变化的

ServletContextAttributeListener:用于监听ServletContext域(应用域)中属性发生变化的监听器

核心方法:

返回值方法名作用
voidattributeAdded(ServletContextAttributeEvent scae)域中添加了属性触发此方法
voidattributeRemoved(ServletContextAttributeEvent scae)域中删除了属性触发此方法
voidattributeReplaced(ServletContextAttributeEvent scae)域中属性发生改变触发此方法
  • 参数是ServletContextAttributeEvent事件对象,事件是【添加属性】。

  • 事件对象中封装着事件源,即ServletContext。

  • 当ServletContext执行setAttribute方法时,此方法可以知道,并执行。

public interface ServletContextAttributeListener extends EventListener {
    /**
     * 域中添加了属性触发此方法。参数是ServletContextAttributeEvent事件对象,事件是【添加属性】。
     * 事件对象中封装着事件源,即ServletContext。
     * 当ServletContext执行setAttribute方法时,此方法可以知道,并执行。
     */
    public default void attributeAdded(ServletContextAttributeEvent scae) {
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(ServletContextAttributeEvent scae) {
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(ServletContextAttributeEvent scae) {
    }
}

HttpSessionAttributeListener:用于监听HttpSession域(会话域)中属性发生变化的监听器

核心方法:

返回值方法名作用
voidattributeAdded(HttpSessionBindingEvent se)域中添加了属性触发此方法
voidattributeRemoved(HttpSessionBindingEvent se)域中删除了属性触发此方法
voidattributeReplaced(HttpSessionBindingEvent se)域中属性发生改变触发此方法
  • 参数是HttpSessionBindingEvent事件对象。

  • 事件对象中封装着事件源,即HttpSession。

  • 真正的事件是指,添加、移除、替换会话域中的属性操作。

public interface HttpSessionAttributeListener extends EventListener {

    /**
     * 域中添加了属性触发此方法。
     */
    public default void attributeAdded(HttpSessionBindingEvent se) {
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(HttpSessionBindingEvent se) {
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(HttpSessionBindingEvent se) {
    }
}

ServletRequestAttributeListener:用于监听ServletRequest域(请求域)中属性发生变化的监听器

核心方法:

返回值方法名作用
voidattributeAdded(ServletRequestAttributeEvent srae)域中添加了属性触发此方法
voidattributeRemoved(ServletRequestAttributeEvent srae)域中删除了属性触发此方法
voidattributeReplaced(ServletRequestAttributeEvent srae)域中属性发生改变触发此方法
  • 参数是ServletRequestAttributeEvent事件对象。

  • 事件对象中封装着事件源,即ServletRequest。

  • 真正的事件是指,添加、移除、替换会话域中的属性操作。

public interface ServletRequestAttributeListener extends EventListener {
    /**
     * 域中添加了属性触发此方法。
     */
    public default void attributeAdded(ServletRequestAttributeEvent srae) {
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(ServletRequestAttributeEvent srae) {
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(ServletRequestAttributeEvent srae) {
    }
}

1.3 和会话相关的两个感知型监听器

和会话域相关的两个感知型监听器是无需配置的,直接编写代码即可

HttpSessionBinderListener:用于感知对象和和会话域绑定的监听器

返回值方法名作用
voidvalueBound(HttpSessionBindingEvent event)当数据加入会话域时 绑定此方法执行
voidvalueUnbound(HttpSessionBindingEvent event)会话域移除时也 ,解绑 此方法执行
public interface HttpSessionBindingListener extends EventListener {
​
    /**
     * 当数据加入会话域时,也就是绑定,此方法执行
     */
    public default void valueBound(HttpSessionBindingEvent event) {
    }
​
    /**
     * 当从会话域移除时,也就是解绑,此方法执行
     */
    public default void valueUnbound(HttpSessionBindingEvent event) {
    }
}

HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器

返回值方法名作用
voidsessionWillPassivate(HttpSessionEvent se)当会话域中的数据钝化时,此方法执行
voidsessionDidActivate(HttpSessionEvent se)当会话域中的数据活化时(激活),此方法执行
public interface HttpSessionActivationListener extends EventListener {
​
    /**
     * 当会话域中的数据钝化时,此方法执行
     */
    public default void sessionWillPassivate(HttpSessionEvent se) {
    }
​
    /**
     * 当会话域中的数据活化时(激活),此方法执行
     */
    public default void sessionDidActivate(HttpSessionEvent se) {
    }
}

2. 监听器的使用

在实际开发中,我们可以根据具体情况来从这8个监听器中选择使用。感知型监听器由于无需配置,只需要根据实际需求编写代码,所以此处我们就不再演示了。我们在剩余6个中分别选择一个监听对象创建销毁和对象域中属性发生变化的监听器演示一下。

2.1 ServletContextListener的使用

/*
    ServletContext对象的创建和销毁的监听器
 */
//@WebListener
public class ServletContextListenerDemo implements ServletContextListener{
    /*
        ServletContext对象创建的时候执行此方法
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到了对象的创建...");
​
    //获取对象
    ServletContext servletContext = sce.getServletContext();
   //System.out.println(servletContext);
​
    //添加属性
    servletContext.setAttribute("username","zhangsan");
​
    //替换属性
    servletContext.setAttribute("username","lisi");
​
    //移除属性
    servletContext.removeAttribute("username");
}
​
/*
    ServletContext对象销毁的时候执行此方法
 */
@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("监听到了对象的销毁...");
}
​
}

配置监听器:

<!--配置监听器-->
<listener>
    <listener-class>com.by.web.listener.ServletContextListenerDemo</listener-class>
</listener>

2.2 ServletContextAttributeListener的使用

/*
    应用域对象中的属性变化的监听器
 */
//@WebListener
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener{
    /*
        向应用域对象中添加属性时执行此方法
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("监听到了属性的添加...");
​
    //获取应用域对象
    ServletContext servletContext = scae.getServletContext();
    //获取属性
    Object value = servletContext.getAttribute("username");
    System.out.println(value);
}
/*
    向应用域对象中替换属性时执行此方法
 */
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
    System.out.println("监听到了属性的替换...");
​
    //获取应用域对象
    ServletContext servletContext = scae.getServletContext();
    //获取属性
    Object value = servletContext.getAttribute("username");
    System.out.println(value);
}
/*
    向应用域对象中移除属性时执行此方法
 */
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
    System.out.println("监听到了属性的移除...");
​
   //获取应用域对象
  ServletContext servletContext = scae.getServletContext();
  //获取属性
 Object value = servletContext.getAttribute("username");
  System.out.println(value);
}
​
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值