ServletContextListener是对ServeltContext的一个监听,主要监听关于ServletContext的两个事件,即初始化和销毁。
【原理】
ServletContextListener对应的是application范围。Servlet一旦被创建,ServletContext也同时被创建了,同时ServletContextListener也监听到了,随即将自己要监听的相关信息设置在ServletContext中,所以listener的执行时间比servlet更早。
Web容器先解析web.xml,获取listener的值。通过反射生成对象放进缓存,然后创建ServletContext对象和servletContextEvent对象,然后再调用ServletContextListener的contextInitialized方法,在方法里面调用event.getServletContext()可以获取ServletContext,ServeltContext是全局对象,其中的数据供所有的应用程序共享,进行一些业务的初始化。
(PS: JSP,使用application.getAttribute();Servlet,使用 getServletContext().getAttribute())
Web容器关闭,ServeltContextListener就会调用contextDestroyed。
【代码实现】
1.新建一个类,实现servletCOntextListener接口,以及它的两个函数。
2.在web.xml配置文件中配置监听器
Web.xml配置:
<listener>
<listener-class>com.bjpowernode.drp.util.listener.InitListener</listener-class>
</listener>
监听类代码:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.bjpowernode.drp.util.BeanFactory;
import com.bjpowernode.drp.util.Constants;
/**
* 采用ServletContextListener完成初始化
*
* @author Administrator
*
*/
public class InitListener implements ServletContextListener {
/**
* 从tomcat中移除
*/
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
System.out.println("InitListener.init()");
System.out.println("创建系统的BeanFactory...");
// 将抽象工厂放到ServletContext中
BeanFactory beanFactory = BeanFactory.getInstance();
sce.getServletContext().setAttribute("beanFactory", beanFactory);
// 加入常量,根据业务进行的初始化处理
sce.getServletContext().setAttribute("add", Constants.ADD);
sce.getServletContext().setAttribute("del", Constants.DEL);
sce.getServletContext().setAttribute("modify", Constants.MODIFY);
sce.getServletContext().setAttribute("showAdd", Constants.SHOW_ADD);
sce.getServletContext().setAttribute("audit", Constants.AUDIT);
}
}