i,j都是static变量,static是一个全局共享变量,i始终未有变化,故一直为1
j则每次运行都会刷新

解决方案 »

  1.   

    这就是问题的所在呀,可能我没说清楚呀
    如果只运行一次,控制台输出
    dopost   1     3 
    dopost   1     3 
    页面输出
    dopost   1   3 
    可这样说也不对
    我想了又想可能是我在submit中用的onclick事件如下:
    document.myfrm.action="action";
    myfrm.onsubmit();
    如果这样能解释
    onclick提交一次,submit又提交一次的话,
    可我改成像上面这样写的这样还是出来两值,我用的tomcat,我把work文件夹删了,运行还是不对,至少和我想的不对
    换句话讲,他的dopost方法有时是两次,有时是一次,我没有发现规律,希望高人们有空能告诉到底是为什么,我只是想弄清楚问题
      

  2.   

    lz的这个输出让我很费解.刷新2次是在提交之后再刷新2次吗?这样好像第一次输出i=1,j=3就应该是对的.
    第二次就.......真的不理解.
      

  3.   

    为什么J=3呀,其实这个问题我也说不上,为了这个我重新解压tomcat就像上面的那样,可为什么出来的东西让人无法理解呢
      

  4.   

    不会吧  
    我测试了你的代码,没出错啊:
    控制台打印的信息:2007-12-8 15:15:40 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    信息: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Java\jre1.5.0\bin;.;C:\WINDOWS\system32;C:\WINDOWS;D:\Java\jre1.5.0\bin\client;D:\Java\jre1.5.0\bin;E:\oracle\ora90\bin;E:\oracle\ora90\Apache\Perl\5.00503\bin\mswin32-x86;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\UltraEdit-32;E:\oracle\ora90\bin;E:\oracle\ora90\Apache\Perl\5.00503\bin\mswin32-x86;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\UltraEdit-32;D:\Java\jdk1.5.0\bin;D:\tomcat\bin;.
    2007-12-8 15:15:41 org.apache.coyote.http11.Http11BaseProtocol init
    信息: Initializing Coyote HTTP/1.1 on http-8181
    2007-12-8 15:15:41 org.apache.catalina.startup.Catalina load
    信息: Initialization processed in 4000 ms
    2007-12-8 15:15:41 org.apache.catalina.core.StandardService start
    信息: Starting service Catalina
    2007-12-8 15:15:41 org.apache.catalina.core.StandardEngine start
    信息: Starting Servlet Engine: Apache Tomcat/5.5.25
    2007-12-8 15:15:41 org.apache.catalina.core.StandardHost start
    信息: XML validation disabled
    log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
    log4j:WARN Please initialize the log4j system properly.
    2007-12-8 15:15:44 org.apache.coyote.http11.Http11BaseProtocol start
    信息: Starting Coyote HTTP/1.1 on http-8181
    2007-12-8 15:15:44 org.apache.jk.common.ChannelSocket init
    信息: JK: ajp13 listening on /0.0.0.0:8009
    2007-12-8 15:15:44 org.apache.jk.server.JkMain start
    信息: Jk running ID=0 time=0/78  config=null
    2007-12-8 15:15:44 org.apache.catalina.storeconfig.StoreLoader load
    信息: Find registry server-registry.xml at classpath resource
    2007-12-8 15:15:44 org.apache.catalina.startup.Catalina start
    信息: Server startup in 3234 ms
    dopost 1  2
    dopost 1  3
    dopost 1  4
    dopost 1  5其实的你的代码是有缺陷的,有成员变量和static变量就必须考虑他的同步问题;
    你应该把j++,和i++
    加同步:
    写一个getNum()的方法同步:private synchornized int getI(){
        i++;
        return i;
    }
    private synchornized int getJ(){
        i++;
        return i;
    }
    然后在doGet()和doPost()方法中调用
      

  5.   


    private synchornized int getJ(){
        j++;
        return j;
    }
    上面的写错了
      

  6.   

    还有一个是在别的Servlet里用i, j时即使同步也有可能出现问题
    i,j是可是全局变量.犹如ServletContext
      

  7.   

    private   static   int   i=1; 
    private   static   int   j=1; 
    其他问题没有,既然是计数的话.你不必用static  修饰.明显TOMCAT利用的单例模式.不用static也是一样
      

  8.   

    问题我不是要计数,我不是设计什么线程安全的servlet
    我发现调用我的一个servlet的时候控制台对同一句话输出了两次,用我的理解是这个方法执行了两次。而这是我不理解的
    所以我写出了这个servlet来问,新建的工程,新安装的tomcat没有过滤器,没有改任何配置干干净的
    tomcat5.5.25,jdk1.6.0_2