gpt4 book ai didi

java - HttpSession 属性 : Why is the attribute not updated

转载 作者:行者123 更新时间:2023-12-01 23:08:51 25 4
gpt4 key购买 nike

我正在练习 session 和 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);

更新 session 中“timesVisited”属性的值。如果我注释该行,则每次调用 servlet 时该值将始终为 1。我期望,由于属性对象链接到 session ,如果我更新 servlet 中的属性值(正如该示例中所发生的那样),它只会在 Session 中获取新值,而无需调用再次“设置属性”。

有人知道我错过了什么吗?我确信这是我从未见过的完全蹩脚的东西。

感谢您的宝贵时间。

最佳答案

当你这样做时visits = visits + 1 ,您将一个新对象分配给访问引用,并且 session 继续指向旧值:

获取属性之前:

session ---> Integer(1)

获取属性后:

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

visits = visits + 1之后

session ---> Integer(1)

visits ----> Integer(2)

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

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

哪里increment()会做:

this.value++;

Java有这样一个类:AtomicInteger:

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

关于java - HttpSession 属性 : Why is the attribute not updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com