当Web应用在Web容器中运行时,Web应用内部会不断发生各种事件:如Web应用被启动、Web应用被停止、用户Session开始、用户Session结束、用户请求到达等,通常来说这些Web事件对于开发者是透明的。Servlet API提供了大量的监听器来监听Web应用的内部事件,从而允许当Web内部事件发生时回调事件监听器内的方法。这些监听器就是我们这一节要介绍的Listener。
Listener
实现Listener的步骤:
我们在使用Listener的过程中,只需要两个步骤:
- 定义Listener实现类。
- 通过注解或者在web.xml文件中配置Listener。
常用的Web事件监听器:
- ServletContextListener:用于监听Web应用的启动和关闭。
- ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变。
- ServletRequestListener:用于监听用户请求。
- ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。
- HttpSessionListener:用于监听用户Session的开始和结束。
- HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。
Listener配置:
配置Listener只要向Web应用注册Listener实现类就可以了,无需配置参数之类的东西,所以配置过程非常简单,并且它的配置和Servlet一样,有两种配置的方式:
- 使用@WebListener修饰Listener实现类即可。
- 在web.xml文档中使用
<listener>
<listener-class>com.example.TestListener</listener-class>
</listener>
Listener使用举例:
在这里我们使用ServletContextListener来实例使用Listener,在使用的时候我们只需要在我们的类中实现ServletContextListener接口,然后将我们要做的工作写在相应的方法中就可以了,代码如下:
package com.example;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* Application Lifecycle Listener implementation class TestListener
*
*/
@WebListener
public class TestListener implements ServletContextListener {
/**
* Default constructor.
*/
public TestListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Web应用启动");
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Web应用关闭");
}
}
在上面的代码中,我们在contextInitialized方法中输出了“Web应用启动”,在contextDestroyed方法中输出了“Web应用关闭”,这样当Web应用启动的时候,我们可以在控制台中看到“Web应用启动”的字段,而在Web应用关闭的时候看到“Web应用关闭”的字段,这样说明我们的Listener已经成功监听到了Web应用的启动和关闭,而我们也可以在这里让监听器做更多的工作,例如可以在Web应用启动的时候连接数据库并且获取到数据库的连接,然后在Web应用关闭的时候断开数据库的连接。
其他的Web Listener类就不在一一举例,它们的使用都和上述例子中的使用类似,只是不同的Listener实现类中方法也不同,我们在使用这些Listener类的时候要注意识别每个方法是在什么时候被调用的。