作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在练习 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/
我是一名优秀的程序员,十分优秀!