gpt4 book ai didi

Java Servlet session.getAttribute 和 setAttribute

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

我试图为每个 session 的获取请求创建一个计数器,我终于做到了,但是,我有一个问题,以便深入了解其工作原理。这是我的代码:

public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
final String COUNTER = "Counter";
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
PrintWriter out = resp.getWriter();
int count = 1;
Integer i = (Integer) session.getAttribute(COUNTER);
if(i != null){
count = i.intValue() +1;
}
session.setAttribute(COUNTER, new Integer(count));
out.println("<html>");
out.println("<head>");
out.println("<title>Session Counter</title>");
out.println("</head>");
out.println("<body>");
out.println("Your session ID is <b>" + session.getId());
out.println("</b> and you have hit this page <b>" + count
+ "</b> time(s) during this browser session");
}

问题如下:

Integer i = (Integer) session.getAttribute(COUNTER);
if(i != null){
count = i.intValue() +1;
}

由于我正在创建 Integer i,然后将其转换为整数,这是否意味着无论 String 值如何,它的 int 值始终为 0? (因为COUNTER是String类型)

我的第二个问题是:为什么我在获取 session.setAttribute() 后必须使用它才能打印新值。我的逻辑如下。正如我们所知,每个 servlet 仅实例化一次 - 我获取属性 (session.getAttribute(COUNTER)),检查 i 是否不同于 null,然后递增它,如果我注释 setAttribute,我将无法看到新的增加的值。为什么我必须再次设置才能获得正确的值?当我按下刷新时,我正在发出一个新的 get 请求,它采用 COUNTER 的旧值(例如 2),然后我们检查它是否不为空并将其增加 1。我不明白为什么我必须使用再次session.setAttribute...

谢谢!

最佳答案

第一个问题:否。如果属性不在 session 中,i 将为 null

第二:此行为与不变性概念和理解Java的引用概念有关。

由于 session 存储对象,因此您的计数器将通过自动装箱成为对Integer对象的引用(因此无需创建Integer用手)。它是 JDK 中的不可变类之一,要更改其值,您需要创建一个新的对象引用,这就是为什么需要更新该对象存储在 session 中 - 因为 session 仍然存储旧值的引用地址。

关于Java Servlet session.getAttribute 和 setAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26691399/

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