Servlet中Listener介绍
当Web应用在Web容器中运行时,Web应用内部会不断地发生各种事件:如Web应用被启动、Web应用被停止,用户session开始、用户session结束,用户请求到达等,通常来说这些Web事件对开发者是透明的。
常用的Web事件监听器接口有如下几个。
① ServletContextListener:用于监听Web应用的启动和关闭
contextInitialized(ServletContextEvent sce):启动Web应用时,系统调用Listener的该方法
contextDestroyed(ServletContextEvent sce):关闭Web应用时,系统调用Listener的该方法
ServletContextListener的作用有点类似于load-on-startup Servlet,都可以用于在Web应用启动时,回调方法来启动某些后台程序,这些后台程序负责为系统运行提供支持
② ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变
attributeAdded(ServletContextAttributeEvent event);当程序把一个属性存入application范围时触发该方法。
attributeRemoved(ServletContextAttributeEvent event);当程序把一个属性从application范围删除时触发该方法。
attributeReplaced(ServletContextAttributeEvent event);当程序替换application范围内的属性时触发该方法。
③ ServletRequestListener:用于监听用户请求
requestInitialized(ServletRequestEvent sre):用户请求到达、被初始化时触发该方法
requestDestroyed(ServletRequestEvent sre):用户请求结束、被销毁时触发该方法
④ ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变。
attributeAdded(ServletRequestAttributeEvent event);当程序把一个属性存入request范围时触发该方法。
attributeRemoved(ServletRequestAttributeEvent event);当程序把一个属性从v范围删除时触发该方法。
attributeReplaced(ServletRequestAttributeEvent event);当程序替换request范围内的属性时触发该方法。
⑤ HttpSessionListener:用于监听用户session的开始和结束
sessionInitialized(HttpSessionEvent sre):用户请求到达、被初始化时触发该方法
sessionDestroyed(HttpSessionEvent sre):用户请求结束、被销毁时触发该方法
⑥ HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变
attributeAdded(HttpSessionAttributeEvent event);当程序把一个属性存入request范围时触发该方法。
attributeRemoved(HttpSessionAttributeEvent event);当程序把一个属性从v范围删除时触发该方法。
attributeReplaced(HttpSessionAttributeEvent event);当程序替换request范围内的属性时触发该方法。
现实中一个具体例子是:一个拍卖网站,上线拍卖的物品在新建时指定找过期时间,超过过期时间后应该改变该物品的状态为流拍状态,这是可使用实现ServletContextListener的监听器(在Web应用启动时它就应该被初始化),在该监听器中使用java.util.Timer实行定时去检查是否有存在超期的物品,有则改变物品状态
public void contextInitialized(ServletContextEvent sce) { java.util.Timer timer = new java.util.Timer(true); timer.schedule(new TimerTask() { //该任务的执行体 public void run() { try { mgr.updateWiner(); } catch (AuctionException ae) { ae.printStackTrace(); } } }, 0 , 1000 * 3600); }