HttpSession属性:为什么属性未更新

时间:2014-03-11 20:03:11

标签: java servlets httpsession

我正在练习一些会话和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);

更新&#34; timesVisited&#34;的值会话的属性。如果我对该行进行注释,则每次调用servlet时该值将始终为1。我期待这一点,因为属性对象链接到会话,如果我更新了servlet中属性的值(就像在该示例中那样),它只会在Session中获取新值而无需调用&#34;的setAttribute&#34;再次。

有谁知道我错过了什么?我确信这是完全蹩脚的,我没见过。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

执行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();

答案 1 :(得分:1)

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

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

现在,如果整数(它没有)像setValue(int newValue)这样的方法,你就不必处理整数的新实例。