Listener--ServletContextListener接口的使用详解

ServleContextListener

ServleContextListener监听的是ServletContext域的创建与销毁。

实际上ServeltContextListener是生成ServeltContext对象之后调用的.生成ServeltContext对象之后,这些代码在我们业务实现之前就写好,它怎么知道我们生成类的名字.实际上它并不需要知道我们的类名,类里面有方法.他们提供一个规范,就一个接口,ServeltContextListner,只要继承这个接口就必须实现这个方法.然后这个类在web.xml中Listener节点配置好.Servelt容器先解析web.xml,获取Listener的值.通过反射生成对象放进缓存.然后创建ServeltContext对象和ServletContextEvent对象.然后在调用ServletContextListener的contextInitialized方法,然后方法可以把用户的业务需求写进去.struts和spring框架就是类似这样的实现,我们以后写一些框架也可以在用.

  • ServletContext域的生命周期
    何时创建:服务器启动创建
    何时销毁:服务器关闭销毁

  • 监听器的编写步骤:

  1. 编写一个监听器类去实现监听器接口
  2. 覆盖监听器的方法
  3. 需要在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监听器的主要作用
    1. 初始化工作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化)
    2. 加载一些初始化的配置文件(例如Spring的配置文件)
    3. 任务调度(定时器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
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值