我正在练习一些会话和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;再次。
有谁知道我错过了什么?我确信这是完全蹩脚的,我没见过。
感谢您的时间。
答案 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)这样的方法,你就不必处理整数的新实例。