监听器的作用
- Listener的作用对Web应用对象的行为进行监控。
- 通过Listener监听自动触发指定功能代码。
这里Web应用对象通常指这三种:
ServletContext–对全局ServletContext及其属性进行监听
HttpSession–对用户会话及其属性操作进行监听
ServletRequest–对请求以及属性操作进行监听
在这些属性进行修改时,就会被监听器捕获,从而执行相应的功能代码。
开发监听器的三要素
- 实现XxxLsitener接口,不同接口对应不同监听对象
- 实现每个接口中独有的方法,实现触发监听的后续操作
- 在web.xml中配置标签使监听器生效
实例操作
在这里我们实际操作一下(开发工具使用的Eclipse),首先创建一个Web工程,工程名为first-listener,在src文件夹中创建一个包,包名为com.sias.listener,在该包中创建一个类,类名为FirstListener。
上图为我们的工程结构图,接下来我们将在FirstListener类中实现我们第一个监听器。
package com.imooc.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//导入ServletContextListener监听器接口
public class FirstListener implements ServletContextListener{
//重写监听器初始化方法
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext已初始化");
}
//重写监听器销毁方法
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext已销毁");
}
}
此时我们监听器已经完成,接下来将监听器配置使用。
监听器的配置方法
- 监听器web.xml配置
<listener> <listener-class>包名.类名 <listener-class> <listener>
2.监听器注释
@WebListener
个人建议对于像监听器这种全局变量建议在web.xml文件中配置。
实例操作
- 我们首先在web.xml文件中配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>first-listener</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Listener监听器配置语句 -->
<listener>
<listener-class>com.sias.listener.FirstListener</listener-class>
</listener>
</web-app>
这时候我们就配置成功了。
接下来我们启动程序。接下来我们观察控制台。
在这里我们可以看到在启动Tomcat服务器时,自动调用了监听器初始化方法contextInitialized(),在控制台打印出“ServletContext已初始化”。
在这里说明一下,ServletContext全局对象在应用启动时会自动初始化,而我们的监听器捕获到了ServletContext的初始化操作,所以就自动调用了监听器初始化方法,所以在控制台就输出了“ServletContext已初始化”。
接下来我们关闭服务器,观察控制塔台,发现调用了监听器的销毁方法输出“ServletContext已销毁”。
2.接下来我们尝试用注释的方法配置监听器。
首先我们先要把web.xml中配置监听器的语句给注释掉,接下来,打开FirstListener类在里面添加 @WebListener注释。
package com.sias.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//监听器注释
@WebListener
public class FirstListener implements ServletContextListener{
//监听器初始化方法
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext已初始化");
}
//监听器销毁方法
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext已销毁");
}
}
我们再次启动程序,发现控制台输出的语句跟配置web.xml的输出语句一模一样,这说明我们配置成功了。
在这里多提一嘴,过滤器和监听器的区别:
过滤器(Filter)的职责是对URL进行过滤拦截,是主动的执行
监听器(Listener)的职责是对Web对象进行监听,是被动触发
注:本篇文章仅个人见解,若有错误,欢迎指正!