本帖最后由 jxsfreedom 于 2010-07-02 23:14:27 编辑

解决方案 »

  1.   

    一般来说,Web容器会把每个JSP生成一个与之对应的Servlet,而且采用单例管理,也就是说,用户的每次请求都会访问同一个JSP对应的Servlet,你在<%!%>中声明的变量是作为与JSP对应的Servlet的一个成员变量,由于所有用户都是访问同一个Servlet,那它里面的成员变量当然是共享的,针对每个JSP页面生成的Servlet源文件楼主可以去Tomcat的work目录中找。楼主可以试一下,第一次访问以后重启一下Web容器,然后再进行第二次访问,你会发现这回是“D 0”了,因为重启后原来Web容器中加载的Servlet全部销毁,需要重新加载,会执行int number=0。
      

  2.   

    lz的jsp生成的Servlet代码类似于
    class ...{
    int number=0;//定义一个变量,记录访问人数。
    synchronized void countPeople(){       if(number==0){          try{
                  File f=new File("E:\\countPeople.txt");
                  FileInputStream in=new FileInputStream(f);
                  DataInputStream dataIn=new DataInputStream(in);
                  number=dataIn.readInt();
                  number++;
                  in.close();dataIn.close();
                  System.out.println("A " + number);
              }catch(FileNotFoundException e){
                   number++;
                   try{
                     File f=new File("E:\\countPeople.txt");
                     FileOutputStream out=new FileOutputStream(f);
                     DataOutputStream dataOut=new DataOutputStream(out);
                     dataOut.writeInt(number);
                     out.close();dataOut.close();
                     System.out.println("B " + number);
                   }catch(IOException ee){}
               }catch(IOException ee){}
               
           }else{            number++;
                try{
                     File f=new File("E:\\countPeople.txt");
                     FileOutputStream out=new FileOutputStream(f);
                     DataOutputStream dataOut=new DataOutputStream(out);
                     dataOut.writeInt(number);
                     out.close();dataOut.close();
                     System.out.println("C " + number);
                }catch(FileNotFoundException e){}
                 catch(IOException e){}       }   }
    public ... service(...){
      System.out.println("D " + number);
        if(session.isNew()){
          countPeople();
          String str=String.valueOf(number);
          session.setAttribute("count",str);
        }}
    }
    而tomcat的执行过程是:
       当以个请求过来后tomcat会首先去找请求的Servlet实例对象,如果找到了则直接执行service方法,如果没找到,才会重新创建一个.也就是说在不重启服务器的情况下Servlet只会创建一次,初始化一次,除非Servlet创建后又被销毁了.
       如果要统计访问人数吧,最好还是每次都去文件中拿最新的数据再++,这样也就不会因为服务器重启,而导致数据丢失了 
      

  3.   

    Donde Voy Java 群组
    1号: 82085373
    2号: 55191814
    3号: 89238748
    4号: 56418364
    5号: 157181129
    6号: 74671714请勿重复加群......
      

  4.   

    你加不加synchronized是一样,因为tomcat本身就是多线程的,你要想让这个页面不用多线程,需要在页面加上
    <%@ page isThreadSafe="false"%>