当我更改对象时 Java 会话如何工作

How does Java session work when I change the object

最近,我正在尝试使用 Java 会话编写购物车。我使用 List 对象存储产品,然后存储在会话中。当用户更改产品数量时,我使用下面的代码尝试更新会话。它确实有效,因为当我刷新我的页面时,购物车图标旁边显示的数字发生了变化,但我真的不知道它是如何工作的。谁能帮帮我 ;/ ?
这是用户取消特定产品时的代码,我只是从列表中删除:

List<OrderProduct> orderProductList = (ArrayList<OrderProduct>)session.getAttribute("orderProductList");
for (int i = 0; i < orderProductList.size(); i ++) {
        if (orderProductList.get(i).getProduct().getId() == productID) {
            orderProductList.remove(i); 
        }
    }

我的问题是我没有这样做

    session.setAttribute(...)

但是当我在 jsp 中检索会话时,存储在会话中的对象发生了变化,它是如何工作的?

您可以将 HttpSession 视为 servlet 容器为您跨请求维护的一种每用户 Map。启动会话后,容器会生成一个唯一的 sessionid cookie 并将其设置在响应中,并为您提供一个实例,您可以将会话数据与之相关联。对于后续请求,容器负责识别 sessionid cookie 并为您提供 HttpSession 的实例,其中包含特定于该会话的数据。您不需要像

那样调用 setAttribute
SomeObj obj = new SomeObj();
Map<String, SomeObj> map = HashMap();
map.put("key", obj);
SomeObj o2 = map.get("key");
o2.setProperty("foo");

现在您已经更改了 obj 的状态,而它仍在您的地图中。您不需要再次调用 map.put。