2 yc451075935 yc451075935 于 2014.10.24 17:23 提问

为什么session.isNew()刷新页面后总会返回TRUE

小白最近刚接触JSP,在用session对象写一个防刷新计数器时遇到了问题。理想情况下是刷新页面时计数器不+1,仅当关闭浏览器再重新打开时才会+1;可是在Eclipse JavaEE的内部浏览器测试时刷新网页计数器也会+1,不知道出了什么问题,下面贴出代码,恳请各位前辈指教

<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <%!
        int number=0;
        synchronized void countpeople(){
        number++;
    }
    %>
    <%
        if (session.isNew()){
            countpeople();
            String num=String.valueOf(number);
            session.setAttribute("counter", num);
        }
    %>
    您是第<%=session.getAttribute("counter")%>位访问者!
</body>
</html>

2个回答

haogezuishuai
haogezuishuai   2014.10.24 17:30

第一个脚本里不要加“!”,用<% %>

haogezuishuai
haogezuishuai 你把变量声明和方法分开写,<%int number = 0; %>,然后在另一个脚本中写方法,<%! %> 和<%%>的区别在于:前者定义的变量在jsp被转化为.java文件时会成为全局变量,而后者则会是局部变量,由于你定义的是全局变量,所以每次刷新时,都会在原来数据的基础上加1!而局部变量是:当你每次刷新请求时,都会在方法里重新生成,从0开始计算!你可以在jsp编译成servlet时,在服务器上查看到这个.java文件,你可以看看,加上和不加感叹号的区别!
3 年多之前 回复
yc451075935
yc451075935 我第一个脚本是函数和变量的声明啊,去了就会报错
3 年多之前 回复
cainiaobegin
cainiaobegin   2015.11.22 11:46

你不应该用session,你要用application;
代码
<%
Integer yourNumber = new Integer(0);
%>
if(session.isNew()){
Integer number = (Integer)application.getAttribute("Count");
if(number == null){
number = new Integer(1);
}
else{
number = new Integer(number.intValue()+1);
}
application.setAttribute("Count",number);
yourNumber = (Integer)application.getAttribute("Count");

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!