使用Listener只需要两个步骤:
- 定义Listener实现类。
- 通过Annotation或在web.xml文件中配置Listener
实现Listener类
监听不同Web事件的监听器不相同,常用的Web事件监听器接口有如下几个:
- ServletContextListener:用于监听Web应用的启动和关闭。
- ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变。
- ServletRequestListener:用于监听用户请求。
- ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。
- HttpSessionListener:用于监听用户session的开始和结束。
- HttpSessionAttributeListener:用于监听HttpSesssion范围(session)内属性的改变。
以ServletContextListener为例,要实现这个接口,需要实现两个方法:
- contextInitialized(ServletCOntextEvent sce):启动web应用时,系统调用Listener的该方法。
- contextDestroyed(ServletContextEvent sce):关闭web应用时,系统调用Listener的该方法。
ServletContextListener的作用有点类似于load-on-startup Servlet,都可用于在Web应用启动时,回调方法来启动某些后台程序,这些后台程序负责为系统运行提供支持。
例:创建一个Listener,用于在启动时获取数据库连接,设置到application中,关闭应用时,关闭连接。
@WebListener
public class GetConnListener implements ServletContextListener{
//应用启动是,该方法被调用
public void contextInitialized(ServletContextEvent sce){
try{
//取得应用的ServletContext实例
ServletContext application = sce.getServletContext();
//从配置参数中获取数据库信息
String driver = application.getInitParameter("driver");
String url = application.getInitParameter("url");
String user = application.getInitParameter("user");
String pass = application.getInitParameter("pass");
//注册驱动
Class.forName(driver);
//获取数据库连接
Connection conn = DriverManager.getConnection(url,user,pass);
//将数据库连接设置成application范围内的属性
application.setAttribute("conn",conn);
}catch(Excetpion e){
e.printStackTrace();
}
} //应用关闭时,该方法被调用
public void contextDestroyed(ServletContextEvent sce){
//取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
Connection conn = (Connection)application.getAttribute("conn");
//关闭数据库连接
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
配置Listener
配置Listener只要向Web应用注册Listener实现类即可,无需配置参数之类的东西。为Web应用配置Listener有两种方式:
- 使用@WebListener修饰Listener实现类。
- 在web.xml文档中使用<listener.../>元素进行配置。
使用@WebListener时通常无需指定任何属性,只要使用该Annotation修饰Listener实现类即可向Web应用注册该监听器。
在web.xml中使用<listener.../>元素进行配置时只要配置其实现类即可,如:
<listener>
<!-- 指定Listener的实现类 -->
<listener-class>luxl.GetGonnListener</listener-class>
</listener>
使用ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext(application)范围内属性的变化,实现该接口的监听器需要实现三个方法:
- attributeAdded(ServletCOntextAttributeEvent event);当程序把一个属性存入application范围时出发该方法。
- attributeRemoved(ServletContextAttributeEvent event);当程序把一个属性从application范围删除时出发该方法。
- attributeReplaced(ServletContextAttributeEvent event);当程序替换application范围内的属性时将出发该方法。
使用ServletRequestListener和ServletRequestAttributeListener
ServletRequestListener用于监听用户请求的到达,实现该接口的监听器需要实现如下两个方法:
- requestInitialized(ServletRequestEvent sre);用户请求到底、被初始化是出发该方法。
- requestDestroyed(ServletRequestEvent sre); 用户请求结束、被销毁时触发该方法。
ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口的监听器需要实现attributeAdded、attributeRemoved、attributeReplaced三个方法。
应用程序完全可以采用一个监听器来监听多个事件,只要让该监听器实现类同时实现多个监听器接口即可,不如同时实现ServletRequestListener、ServletRequesetAttributeListener。
使用HttpSessionListener和HttpSessionAttributeListener与使用ServletRequestListener和ServletRequestAttributeListener非常相似。
HttpSessionListener用于监听用户session的创建和销毁,实现该接口的监听器需要实现:
- sessionCreate(HttpSessionEvent se);用户与服务器的会话开始、创建时触发该方法。
- sessionDestroyed(HttpSessionEvent se);用户与服务器的会话断开、销毁时触发该方法。