问题描述
想用servlet实现在线计数的功能,但是运行的时候不管打开几个浏览器计数总是0,困扰了我好久也不知道为什么,请大家帮忙看看吧,下面是我的代码:counter.java文件:packagesamples.javabean;publicclassCounter{privatestaticintcount=0;publicstaticintgetOnline(){returncount;}publicstaticvoidraise(){count++;}publicstaticvoidreduce(){count--;}}OnlineCounterListener文件:packagesamples.servlet;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;importsamples.javabean.Counter;publicclassOnlineCounterListenerimplementsHttpSessionListener{publicvoidsessionCreated(HttpSessionEventhse){Counter.raise();}publicvoidsessionDestroyed(HttpSessionEventhse){Counter.reduce();}}在web.xml中加入下面代码:<listener><listener-class>samples.servlet.OnlineCounterListener</listener-class></listener>然后运行这个文件:<%@pagelanguage="java"contentType="text/html;charset=GB2312"pageEncoding="GB2312"%><%@pageimport="samples.javabean.*"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=GB2312"><title>使用Listener</title></head><body><fontsize=2>在线人数:<%=Counter.getOnline()%><br></font></body></html>请大家帮帮忙,万分感谢!!
解决方案
解决方案二:
补充一下,有的时候运行结果是最多只可以增加到2,然后就不再变了,很奇怪,不知道为什么啊?
解决方案三:
统计在线人数(及其信息),就是统计现在有多少个Session实例存在,我们可以增加一个计数器(如果想存储更多的信息,可以用一个对象来做计数器,随后给出的实例中,简单起见,用一个整数变量作为计数器),通过在valueBound方法中给计数器加1,valueUnbound方法中计数器减1,即可实现在线人数的统计。当然,这里面要利用到ServletContext的全局特性。(有关ServletContext的叙述请参考Servlet规范),新建一个监听器,并将其实例存入ServletContext的属性中,以保证此监听器实例的唯一性,当客户登录时,先判断ServletContext的这个属性是否为空,如果不为空,证明已经创建,直接将此属性取出放入Session中,计数器加1;如果为空则创建一个新的监听器,并存入ServletContext的属性中。举例说明:实现一个监听器://SessionListener.javaimportjava.io.*;importjava.util.*;importjavax.servlet.http.*;//监听登录的整个过程publicclassSessionListenerimplementsHttpSessionBindingListener{publicStringprivateInfo="";//生成监听器的初始化参数字符串privateStringlogString="";//日志记录字符串privateintcount=0;//登录人数计数器publicSessionListener(Stringinfo){this.privateInfo=info;}publicintgetCount(){returncount;}publicvoidvalueBound(HttpSessionBindingEventevent){count++;if(privateInfo.equals("count")){return;}try{Calendarcalendar=newGregorianCalendar();System.out.println("LOGIN:"+privateInfo+"TIME:"+calendar.getTime());logString="nLOGIN:"+privateInfo+"TIME:"+calendar.getTime()+"n";for(inti=1;i<1000;i++){Filefile=newFile("yeeyoo.log"+i);if(!(file.exists()))file.createNewFile();//如果文件不存在,创建此文件if(file.length()>1048576)//如果文件大于1M,重新创建一个文件continue;FileOutputStreamfoo=newFileOutputStream("yeeyoo.log"+i,true);//以append方式打开创建文件foo.write(logString.getBytes(),0,logString.length());//写入日志字符串foo.close();break;//退出}}catch(FileNotFoundExceptione){}catch(IOExceptione){}}publicvoidvalueUnbound(HttpSessionBindingEventevent){count--;if(privateInfo.equals("count")){return;}try{Calendarcalendar=newGregorianCalendar();System.out.println("LOGOUT:"+privateInfo+"TIME:"+calendar.getTime());logString="nLOGOUT:"+privateInfo+"TIME:"+calendar.getTime()+"n";for(inti=1;i<1000;i++){Filefile=newFile("yeeyoo.log"+i);if(!(file.exists()))file.createNewFile();//如果文件不存在,创建此文件if(file.length()>1048576)//如果文件大于1M,重新创建一个文件continue;FileOutputStreamfoo=newFileOutputStream("yeeyoo.log"+i,true);//以append方式打开创建文件foo.write(logString.getBytes(),0,logString.length());//写入日志字符串foo.close();break;//退出}}catch(FileNotFoundExceptione){}catch(IOExceptione){}}}