jsp页面变量的作用域问题

一个jsp页面就是一个java类,它的变量也跟java类一样,有不同的作用域。用下面的实例说明一下。

下面是把“学习日记开源项目”里面的一个名为disall2.jsp的文件在“JAVA学习日记网站”改写的一个片断,我的目的是在一个循环语句的第一个循环中显示广告,后面的循环不显示。用彩色部分的变量来控制。下面是正确的使用方法。




  <% int count = 0; %>



   <logic:iterate id="aGroupGoals" name="groupGoalsList" type="com.learndiary.website.model.GroupGoalsInfo">

    <c:set var="group" value="${aGroupGoals.group}"/>

    <b><u><c:out value="${group.groupName}"/>(<c:out value="${group.goalsNum}"/>个目标)</u></b>

    <c:set var="goalsList" value="${aGroupGoals.goalsList}"/>

    <br>

  <logic:iterate id="aGoal" name="goalsList" type="com.learndiary.website.model.ArticleInfo">

    <html-el:link action="disGoalContentAction.do?goalID=${aGoal.articleID}&naviStr=${requestScope['naviStr']}" target="_blank" title="查看既定目标:${aGoal.articleName}的具体内容" >

     <c:if test="${aGoal.visibility == 1}">

      <font color="red">[私]</font>

     </c:if>

     <c:if test="${aGoal.joinNum >= 5 && aGoal.joinNum<10}">

      <font size="3">

     </c:if>

     <c:if test="${aGoal.joinNum >= 10}">

      <font size="4">

     </c:if>

     <c:out value="${aGoal.articleName}"/>

    </html-el:link>

    (<c:out value="${aGoal.joinNum}"/>/<html-el:link action="diaryAction.do?goalID=${aGoal.articleID}&naviStr=${requestScope['naviStr']}" target="_blank" title="查看实现目标:${aGoal.articleName}下的所有${aGoal.diarySize}篇日记" >

     <b><u> <c:out value="${aGoal.diarySize}"/> </u></b>

     </html-el:link>)

     </font>

      

   </logic:iterate>

   <p align=center>



   <% if (++count == 1) { %>

   <%@ include file="/common/google_intro_4.jsp" %>

   <% }

    %> 



   <hr size="1" noshade="noshade">

    <p>

  </logic:iterate>

但是,如果把蓝色的部分改动一点,只要你第二次刷新页面的时候,广告就消失了。如下:




  <%! int count = 0; %>


原因是:前者是类方法中的局部变量,作用域局限于java类中的一个方法中,即点击一次页面就重新调用类中的方法,于是,它的记数器总能正确的清零;而后者是类成员变量,作用域为类,在类的当前实例(你访问jsp页面时,这个类在服务器端机器的内存中为你一个人创建的一个对象实例)没有销毁之前,它里面的变量始终是一个,当你刷新页面时,记数器就递增了,不能正确的清零。

我是一个java的业余爱好者,理论基础不行。上面的说法如果不当,还希望见者提示一下。谢谢。