inputName.jsp<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=cyan><FONT size=3>
  <FORM action="people.jsp" method=get name=form>
   请输入姓名:<INPUT type="text" name="name"> 
   <BR> <INPUT TYPE="submit" value="送出" name=submit>
  </FORM> 
</BODY></HTML>
people.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY BGCOLOR=yellow><FONT Size=3>
 <%! int count;
     StringBuffer personList;
     public void judge(){
         if(count==0)
             personList=new StringBuffer();
     }
     public void addPerson(String p){
         if(count==0)
             personList.append(p);
         else
            personList.append(","+p);
         count++;
    }
 %>
 <%   String name=request.getParameter("name");
      byte bb[]=name.getBytes("iso-8859-1");
      name=new String(bb);
      if(name.length()==0||name.length()>10){
  %>     <jsp:forward page="inputName.jsp" />
 <%   } 
      judge();
      addPerson(name); 
 %>
 <BR> 目前共有<%=count%>人浏览了该页面,他们的名字是:
 <BR> <%=personList%>
</FONT></BODY></HTML>inputName.jsp供浏览者输入自己的姓名,然后people.jsp进行显示。按照学JAVA基础时的理解应该是每次输出过名字点送出的时候重新调用people.jsp,people.jsp中count重新变成“0”记录姓名的字符串personList变成null,可是为什么每次点送出的时候personList的值依然存在。
我的理解大概是inputName.jsp调用people.jsp,然后people.jsp重新调用     
 judge();
  addPerson(name); 这两个方法。。
也许解释的不是很清楚,希望大家帮帮忙!

解决方案 »

  1.   


    把name和count存入application中吧!
      

  2.   

    上面的例子里面还想没有存在application中啊,我不是问怎么能实现这样的效果,上面的代码已经是我所说的效果了,我是问为什么它是这样的效果1
      

  3.   

    jsp页面上,在<%!%>里面的那个一的变量类似于全局变量,你可以查看一下生成的servlet,这些变量是在service()方法的外部的,是servlet类的成员变量,对于不同的请求,容器每一次会重复调用service方法,但并不会重新初始化servlet的成员变量,只要servlet没有被卸载,servlet类的成员变量的值就是连续的,至于servlet何时被卸载,这个问题我也不清楚。
      

  4.   

    每次请求启动一次新的servlet的线程,而不是new一个新的servlet类,所以把成员变量初始化一次。成员变量供所有线程共享。也就是说它们用的是同一个count和personList 变量。