共计 1666 个字符,预计需要花费 5 分钟才能阅读完成。
除了 Servlet 和 Filter 外,JavaEE 的 Servlet 规范还提供了第三种组件:Listener。
Listener 顾名思义就是监听器,有好几种 Listener,其中最常用的是 ServletContextListener
,我们编写一个实现了ServletContextListener
接口的类如下:
@WebListener
public class AppListener implements ServletContextListener {// 在此初始化 WebApp, 例如打开数据库连接池等:
public void contextInitialized(ServletContextEvent sce) {System.out.println("WebApp initialized.");
}
// 在此清理 WebApp, 例如关闭数据库连接池等:
public void contextDestroyed(ServletContextEvent sce) {System.out.println("WebApp destroyed.");
}
}
任何标注为 @WebListener
,且实现了特定接口的类会被 Web 服务器自动初始化。上述AppListener
实现了 ServletContextListener
接口,它会在整个 Web 应用程序初始化完成后,以及 Web 应用程序关闭后获得回调通知。我们可以把初始化数据库连接池等工作放到 contextInitialized()
回调方法中,把清理资源的工作放到 contextDestroyed()
回调方法中,因为 Web 服务器保证在 contextInitialized()
执行后,才会接受用户的 HTTP 请求。
很多第三方 Web 框架都会通过一个 ServletContextListener
接口初始化自己。
除了 ServletContextListener
外,还有几种 Listener:
- HttpSessionListener:监听 HttpSession 的创建和销毁事件;
- ServletRequestListener:监听 ServletRequest 请求的创建和销毁事件;
- ServletRequestAttributeListener:监听 ServletRequest 请求的属性变化事件(即调用
ServletRequest.setAttribute()
方法); - ServletContextAttributeListener:监听 ServletContext 的属性变化事件(即调用
ServletContext.setAttribute()
方法);
ServletContext
一个 Web 服务器可以运行一个或多个 WebApp,对于每个 WebApp,Web 服务器都会为其创建一个全局唯一的 ServletContext
实例,我们在 AppListener
里面编写的两个回调方法实际上对应的就是 ServletContext
实例的创建和销毁:
public void contextInitialized(ServletContextEvent sce) {System.out.println("WebApp initialized: ServletContext =" + sce.getServletContext());
}
ServletRequest
、HttpSession
等很多对象也提供 getServletContext()
方法获取到同一个 ServletContext
实例。ServletContext
实例最大的作用就是设置和共享全局信息。
此外,ServletContext
还提供了动态添加 Servlet、Filter、Listener 等功能,它允许应用程序在运行期间动态添加一个组件,虽然这个功能不是很常用。
练习
使用 Listener 监听 WebApp。
下载练习
小结
通过 Listener 我们可以监听 Web 应用程序的生命周期,获取 HttpSession
等创建和销毁的事件;
ServletContext
是一个 WebApp 运行期的全局唯一实例,可用于设置和共享配置信息。