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);
	}

相关推荐