一个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>
|
|
但是,如果把蓝色的部分改动一点,只要你第二次刷新页面的时候,广告就消失了。如下:
原因是:前者是类方法中的局部变量,作用域局限于java类中的一个方法中,即点击一次页面就重新调用类中的方法,于是,它的记数器总能正确的清零;而后者是类成员变量,作用域为类,在类的当前实例(你访问jsp页面时,这个类在服务器端机器的内存中为你一个人创建的一个对象实例)没有销毁之前,它里面的变量始终是一个,当你刷新页面时,记数器就递增了,不能正确的清零。
我是一个java的业余爱好者,理论基础不行。上面的说法如果不当,还希望见者提示一下。谢谢。