ServleContextListener
ServleContextListener监听的是ServletContext域的创建与销毁。
实际上ServeltContextListener是生成ServeltContext对象之后调用的.生成ServeltContext对象之后,这些代码在我们业务实现之前就写好,它怎么知道我们生成类的名字.实际上它并不需要知道我们的类名,类里面有方法.他们提供一个规范,就一个接口,ServeltContextListner,只要继承这个接口就必须实现这个方法.然后这个类在web.xml中Listener节点配置好.Servelt容器先解析web.xml,获取Listener的值.通过反射生成对象放进缓存.然后创建ServeltContext对象和ServletContextEvent对象.然后在调用ServletContextListener的contextInitialized方法,然后方法可以把用户的业务需求写进去.struts和spring框架就是类似这样的实现,我们以后写一些框架也可以在用.
-
ServletContext域的生命周期
何时创建:服务器启动创建
何时销毁:服务器关闭销毁 -
监听器的编写步骤:
- 编写一个监听器类去实现监听器接口
- 覆盖监听器的方法
- 需要在web.xml中进行配置–注册
- 监听的方法
//创建ServletContext时执行
@Override
public void contextInitialized(ServletContextEvent sce){
System.out.println("context init...");
}
//销毁ServletContext时执行
@Override
public void contextDestroyed(ServletContextEvent sce){
System.out.println("context destory...");
}
- ServletContextListener监听器的主要作用
- 初始化工作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化)
- 加载一些初始化的配置文件(例如Spring的配置文件)
- 任务调度(定时器Timer/TimerTask)
实例1:通过ServletContextListener获得初始化参数并通过控制台输出
配置初始化参数:
<context-param>
<param-name>testStr</param-name>
<param-value>helloWorld</param-value>
</context-param>
监听器:
package pers.zhang.listener;
/**
* @author zhang
* @date 2019/9/19 - 19:57
*/
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyServletContextListener implements ServletContextListener{
//监听context域对象的创建
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext创建了...");
//获得ServletContext
ServletContext servletContext = sce.getServletContext();
//获得初始化参数
String str = servletContext.getInitParameter("testStr");
//打印
System.out.println(str);
}
//监听context域对象的销毁
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁了...");
}
}
注册监听器:
<listener>
<listener-class>pers.zhang.listener.MyServletContextListener</listener-class>
</listener>
启动服务器,控制台输出:
ServletContext创建了...
helloWorld
关闭服务器,控制台输出:
ServletContext销毁了...
实例2:使用ServletContextListener监听器开启任务调度,每隔5秒在控制台打印当前时间
监听器:
package pers.zhang.listener;
/**
* @author zhang
* @date 2019/9/19 - 19:57
*/
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyServletContextListener implements ServletContextListener{
//监听context域对象的创建
public void contextInitialized(ServletContextEvent sce) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//获取当前时间
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
}
}, new Date(), 5000);
}
//监听context域对象的销毁
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁了...");
}
}
启动服务器,控制台输出:
2019-09-19 21:41:44
2019-09-19 21:41:49
2019-09-19 21:41:54
2019-09-19 21:41:59
2019-09-19 21:42:04