繁体   English   中英

HttpSession属性:为什么不更新该属性

[英]HttpSession attribute : Why is the attribute not updated

我正在使用会话和servlet进行一些练习。 我已经创建了一个servlet对其进行测试,并且具有下一个“ doGet”方法:

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    PrintWriter out = resp.getWriter();
    HttpSession session = req.getSession();
    if(session.isNew()) {
        out.println("Welcome.");
    } else {
        out.println("Nice to see you again.");
    }
    Integer visits = (Integer)session.getAttribute("timesVisited");
    if (visits == null) {
        visits = new Integer(1);
        session.setAttribute("timesVisited", visits);
    } else {
        visits = visits + 1;
        session.setAttribute("timesVisited", visits);
    }
    out.println(" You have visited that servlet " + visits + " times.    ");
    out.println("<a href = \"" + resp.encodeURL("SessionServlet.do") + "\">" + "hola" +  "</a>");
    return;


}

我想知道的是我需要线吗

session.setAttribute("timesVisited", visits);

更新会话上“ timesVisited”属性的值。 如果我注释该行,则每次调用servlet时该值将始终为1。 我期待的是,由于属性对象已链接到会话,因此如果我在servlet中更新属性的值(如该例所示),它将在Session中获得新值而无需调用再次“ setAttribute”。

有人知道我在想什么吗? 我确信这是我从未见过的完全la脚的事情。

谢谢你的时间。

当您进行visits = visits + 1 ,您将为访问引用分配一个新对象,并且会话将始终指向旧值:

获取属性之前:

session ---> Integer(1)

获得属性后:

session ---> Integer(1)
                ^
visits ---------|

visits = visits + 1

session ---> Integer(1)

visits ----> Integer(2)

如果您使用了可变的计数器对象,并且执行了以下操作,则无需在会话中再次设置属性:

Counter counter = (Counter) session.getAttribute("visits");
counter.increment();

increment()将做:

this.value++;

Java具有此类:AtomicInteger:

AtomicInteger counter = session.getAttribute("visits");
counter.incrementAndGet();

因为您正在通过以下行创建Integer的新实例: visits = visits + 1;

当前存储在会话中的实例永不更改。

现在,如果Integer具有(但没有)setValue(int newValue)之类的方法,则不必处理Integer的新实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM