[英]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.