2

我是 servlet 的新手,今天上了第一课。

现在,我正在尝试创建一个统计用户访问次数的 servlet。

总是在我如何增加计数器时出错:

    HttpSession session = req.getSession(true);
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
synchronized (this) {
    if (!session.isNew()) {
        visitCount = (Integer) session.getAttribute(visitCountKey);
        visitCount = new Integer(visitCount.intValue() + 1); //error
    }
    session.setAttribute(visitCountKey, visitCount);
}

我正在创建一个新整数,因为我在 stackoverflow 上看到整数是不可变的。它仍然不起作用,并且在那条线上给了我一个错误。

有人能帮我吗?

亲切的问候,

4

4 回答 4

4

您应该添加null检查visitCount

HttpSession session = req.getSession(true);
String visitCountKey = new String("visitCount");
synchronized (this) {

    Integer visitCount = (Integer) session.getAttribute(visitCountKey);
    if(visitCount == null) {
        visitCount = 0;
    }
    visitCount = new Integer(visitCount.intValue() + 1);
    session.setAttribute(visitCountKey, visitCount);
}
于 2012-04-24T12:28:12.287 回答
1

您可能第一次返回空值。错误是空引用异常吗?

您需要检查 null 并将 visitCount 设置为 0。

于 2012-04-24T12:27:44.420 回答
0

visitCount 为空,因为您使用 isNew() 检查该值是否已存储。

手动检查 visitCount 是否为空。

从文档:

HttpSession 的实现代表服务器的会话视图。在客户端加入之前,服务器认为会话是新的。在客户端加入会话之前,isNew 方法返回 true。true 值可以指示以下三种情况之一:

  • 客户还不知道会话
  • 会议尚未开始
  • 客户端选择不加入会话。如果客户端仅支持 cookie 并选择拒绝服务器发送的任何 cookie,则会发生这种情况。如果服务器支持 URL 重写,这种情况不会经常发生。
于 2012-04-24T12:31:29.413 回答
0

如果您真的决定这样做,您应该将整数visit变量作为静态类变量。

公共静态 int 访问;

public ... doGet(...){ VISIT++; }

于 2012-04-24T12:32:05.030 回答