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
对象销毁的时候被调用