【程序注解】
在OnLineCountListener 里,用count代表当前在线的人数,OnLineCountListener将在Web服务器启动时自动执行。当 OnLineCountListener构造好后,把count设置为0。每增加一个Session,OnLineCountListener会自动调用 sessionCreated(HttpSessionEvent se)方法;每销毁一个Session,OnLineCountListener会自动调用sessionDestroyed (HttpSessionEvent se)方法。当调用sessionCreated(HttpSessionEvent se)方法时,说明又有一个客户在请求,此时使在线的人数(count)加1,并且把count写到ServletContext中。 ServletContext的信息是所有客户端共享的,这样,每个客户端都可以读取到当前在线的人数。
从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest.
Context范围:
ServletContextListener:
对一个应用进行全局监听.随应用启动而启动,随应用消失而消失主要有两个方法:
contextDestroyed(ServletContextEvent event)
在应用关闭的时候调用contextInitialized(ServletContextEvent event)在应用启动的时候调用这个监听器主要用于一些随着应用启动而要完成的工作,也就是很多人说的我想在容器启动的时候干.
一般来说对"全局变量"初始化,如
public void contextInitialized(ServletContextEvent event){ ServletContex sc = event.getServletContext(); sc.setAttribute(name,value); } |
我最喜欢用它来做守护性工作,就是在contextInitialized(ServletContextEvent event)方法中实现一个Timer,然后就让应用在每次启动的时候让这个Timer工作:
程序代码:
public void contextInitialized(ServletContextEvent event){ timer = new Timer(); timer.schedule(new TimerTask(){ public void run(){ //do any things } },0,时间间隔); } |
你只要设一个间隔,然后每次判断一下当时是不是那个时间段就行了啊,比如每月一号做,那你时间间隔设为天,即24小时一个循环,然后在run方法中判断当时日期new Date().getDate()==1就行了啊.如果是每天的12点,那你时间间隔设为小时,然后在run中判断new Date().getHour()
==12,再做某事就行了.
ServletContextAttributeListener:
这个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事件,注意也就是一个"全局变量"在被Add(第一次set),replace(对已有的变量重新赋值)和remove的时候.分别调用下面三个方法:
public void attributeAdded(ServletContextAttributeEvent scab)这个方法不仅可以知道哪些全局变量被加进来,而且可获取容器在启动时自动设置了哪些context变量:
程序代码:
public void attributeAdded(ServletContextAttributeEvent scab){ System.out.println(scab.getName()); } public void attributeRemoved(ServletContextAttributeEvent scab) public void attributeReplaced(ServletContextAttributeEvent scab) |