动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

监听风云之监听器Listener

07-22 16:50 314浏览
举报 T字号
  • 大字
  • 中字
  • 小字

事件监听机制作为web的三大组件之一,在web开发中起到了至关重要的作用,是我们学习web开发的必修课。而其核心组件就是监听器Listenerlistener通过观察者设计模式实现其功能。本文让我们作为旁观者来一起揭晓这一场“监听风云”。

首先我们来了解一下观察者模式,观察者模式又叫发布订阅模式或者监听器模式。在该模式中有两个角色:观察者和被观察者(通常也叫做主题)。观察者在主题里面注册自己感兴趣的事件,当这个事件发生时,主题会通过回调接口的方式来通知观察者。

我们来大致了解一下事件监听机制的实现过程:

1、java的事件监听机制涉及到三个组件:事件源、事件监听器、事件对象。

2、当事件源上发生操作时,它将会调用事件监听器的一个方法,并在调用这个方法时,会传递事件对象过去。

3、事件监听器由开发人员编写,开发人员在事件监听器中,通过事件对象可以拿到事件源,从而对事件源上的操作进行处理。

Listenr作为Servlet的监听器,它可以监听客户端的请求、服务器端的操作等。通过监听器,可以自动激发一些操作,设置一些基本的内容。事实上,Servlet规范定义了一些列的Listener接口类。通过接口类的方式将事件暴露给应用程序,应用程序如果想监听其感兴趣的事件,那么不必去直接注册对应的事件,而是编写自己的listener实现相应的接口类,并将自己的listener注册到servlet容器。当程序关心的事件发生时,servlet容器会通知listener,回调listener里面的方法。这里自定义的listener就是观察者,servlet容器就是主题。

servlet2.4规范提供了8个listener接口,可以将其分为以下三类

第一类:与HttpContext有关的listener接口ServletContextListener、ServletContextAttributeListener

第二类:与HttpSession有关的listner接口HttpSessionListener、HttpSessionAttributeListener、 HttpSessionBindingListener、 HttpSessionActivationListener

 第三类:与ServletRequest有关的Listener接口,ServletRequestListener、ServletRequestAttributeListener

Listener实现了javax.servlet.ServletContextListener接口的服务器端程序,作为web的忠实跟随者,它随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。下面是Listener的代码实现:

项目启动时,先启动监听器,再启动过滤器。

 

/**

 * 通过用于服务器启动一次性加载全局资源文件

 */

//@WebListener

public class ContextLoaderListener implements ServletContextListener {

    /**

     * 监听ServletContext对象创建,服务器启动后自动创建

     * @param servletContextEvent

     */

    @Override

    public void contextInitialized(ServletContextEvent servletContextEvent) {

 

        //1.获取资源路径

        ServletContext servletContext = servletContextEvent.getServletContext();

        String loaderConfig = servletContext.getInitParameter("loaderConfig");

        //2.记载资源文件

        String realPath = servletContext.getRealPath(loaderConfig);

 

        //3.加载进内存

        try {

            FileInputStream stream = new FileInputStream(realPath);

            System.out.println(stream);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        System.out.println("ServletContext创建.....");

    }

    /**

     * 监听ServletContext对象销毁后执行,服务器正常关闭后执行

     * @param servletContextEvent

     */

    @Override

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

        System.out.println("ServletContext销毁.....");

    }

}

 

web.xml配置如下:

 

        listener.ContextLoaderListener

    

 

    

        loaderConfig

        /WEB-INF/classes/application.xml

 

当容器启动时会向日志中输出"ServletContextListener.contextInitialized",当容器关闭时会输出"ServletContextListener.contextDestroyed"。由于一个web应用对应一个servlet上下文。所以ServletContextListener和ServletContextAttributeListener监听的事件的生命范围是贯穿整个web应用的。当web应用初始化的时候,servlet容器会构造ServletContextEven实例,并回调contextInitialize方法。当servlet上下文即将关闭时,一般是在关闭服务器之前,servlet容器会构造ServletContextEven实例,并回调contextDestroyed方法。

实际上我们只需要编写自己的listener去实现我们关心的监听器接口并注册即可,剩下来的工作就是在我们自己的listener里面编写业务逻辑。所以说,listener在这一方面又是灵活多变的,我们可以根据我们的需求来改写相关的监听器接口,实现自己想要的业务逻辑和功能。只要能熟练掌握这门技术,你就能在javaweb开发中叱咤风云。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵1271
程序员代码小兵1271

11篇文章贡献55922字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消