8.2 ServletContext监听器 8.2.1 ServletContextListener
8.2 ServletContext监听器
ServletContext简介
- ServletContext官方叫- servlet上下文。服务器会为每一个工程创建一个- ServletContext对象。
- ServletContext对象是一个全局的储存信息的空间,项目启动时该对象就存在了,项目关闭时才会释放该对象。
ServletContext的监听接口
ServletContext的监听器接口有两个:ServletContextListener和ServletContextAttributeListener。
8.2.1 ServletContextListener
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。
也就是说:ServletContextListener能对ServletContext的创建和销毁做出响应。
响应ServletContext的创建
当ServletContext初始化时,容器会调用所有注册了ServletContextListeners接口的实例的contextInitialized方法。该方法如下:
| 1 | void contextInitialized(ServletContextEvent event) | 
响应ServletContext的销毁
当ServletContext将要销毁时,容器会调用所有注册了ServletContextListeners接口的实例的contextDestroyed方法。该方法如下:
| 1 | void contextDestroyed(ServletContextEvent event) | 
contextInitialized方法和contextDestroyed方法都会从容器获取到一个ServletContextEvent。javax.servlet.ServletContextEvent是一个java.util.EventObject的子类,它定义了一个访问ServletContext的getServletContext方法:
| 1 | ServletContext getServletContext() | 
通过这个方法能够轻松地获取到ServletContext。
实例
这个项目名为:app08a
下面的AppListener.java类实现了ServletContextListener接口,它在ServletContext刚创建时,将一个保存国家编码和国家名的Map放置到ServletContext中。
AppListener.java
| 1 | package app08a.listener; | 
在实现的contextInitialized方法中。先通过调用getServletContext方法从容器获得ServletContext实例,然后创建了一个Map用于保存国家编码和国家名,再将这个Map放置到ServletContext里。
在实际开发中,往往是把数据库里的数据放置到ServletContext里。
下面的countries.jsp用到了这个监听器。
countries.jsp页面
| 1 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> | 
countries.jsp页面使用了JSTL的forEach标签来迭代读取名为countries的map里的数据。
JSTL的使用步骤请看这篇文章
运行效果
运行这个项目,查看控制台可以看到项目启动的时候就调用了contextInitialized方法了如下图所示:
可以通过下面的URL来访问这个JSP页面:
http://localhost:8080/app08a/countries.jsp
浏览器显示效果如下图所示:
小结
- 每个web项目启动时,容器会为该Web项目创建对应一个对应的ServletContext对象.
- 关闭该Web项目时,容器会销毁该Web项目对应的ServletContext对象.
- ServletContext对象的创建和销毁会触发- ServletContextEvent事件
- ServletContextListeners接口的实例可以处理- ServletContextEvent事件。- ServletContextListeners接口的实例的- contextInitialized方法在- ServletContext对象创建时候被调用。
- ServletContextListeners接口的实例的- contextDestroyed方法在- ServletContext对象销毁的时候被调用