事件监听机制作为web的三大组件之一,在web开发中起到了至关重要的作用,是我们学习web开发的必修课。而其核心组件就是监听器Listener,listener通过观察者设计模式实现其功能。本文让我们作为旁观者来一起揭晓这一场“监听风云”。
首先我们来了解一下观察者模式,观察者模式又叫发布订阅模式或者监听器模式。在该模式中有两个角色:观察者和被观察者(通常也叫做主题)。观察者在主题里面注册自己感兴趣的事件,当这个事件发生时,主题会通过回调接口的方式来通知观察者。
我们来大致了解一下事件监听机制的实现过程:
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开发中叱咤风云。
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13