程序如下:
<html>
  <head>
    <title>JSP页面</title>
  </head>
  <body>
    <%--生成并显示一个从0~9的字符串--%>
<%@ page language="java" contentType="text/html;charset=GB2312"%>
<%! String str = "0";%>
<%
  for(int i=1; i<10; i++){
    str = str+i;
  }
%>
<p>
  <%=str%>
</p>
  </body>
</html>问题:这个页面运行的时候,每次刷新的时候都会增加字符串1-9,当我关闭当前页面再打开的时候,实际上实现的还是再刷新一次的结果。刚开始以为是缓存的页面,把缓存清空后,仍然是这样的结果,只有重启tomcat服务器的时候,再打开这个页面,才是最开始运行一次的页面。是不是跟声明的这个变量的范围(application?)有关系呢?但是我找了几本书,都没有说声明的变量的范围,请高手帮忙!
谢谢

解决方案 »

  1.   

    <%! String str = "0";%> 把上面这个!去掉
      

  2.   

    Acylas 谢谢,能在解释一下么?
    为什么把这个去掉,
    谢谢
      

  3.   

    原因:使用<%! %>定义的变量编译成servlet后成为servlet的私有成员变量,在servlet环境中,对于一个JSP页只允许有一个结果servlet的实例在运行和响应所有的页面请求。因此,在结果servlet中所有的成员变量可以被所有的请求所共享,所以只要成员变量没有重新赋值,下次访问该页面时仍然不变。而在<% %>中定义的变量编译成servlet后成为service()方法的一个本地变量,而service()方法中的本地变量只能每响应一次请求就重建一次。同时成员变量会自动初始化,所以只要声明后就可以使用;而本地变量在使用前一定要手动初始化,否则编译出错。解决的办法是将ID用<% %>定义,或在判断ID的操作后重新对ID初始化。
      

  4.   

    zsq007zsq007  终于明白了,太感谢谢了!
      

  5.   

    你可以去看下jsp对应的servlet文件,对照一下,可以让你理解jsp的运行原理
      

  6.   

    简单的说  用<%! %>这个声明变量是全局变量 只要服务没有关闭 这个变量是一直存在的 而 <% %>声明的变量是当前页面的私有变量,如果刷新页面该或关闭页面后 这个变量就会重新初始化了
      

  7.   

    谢谢 zhangj0571  指点
      

  8.   

    学习,,,,,,  还不知道可以用这个定义<!%  %>servlet的私有变量呢,???