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

当我更改对象时,Java会话是如何工作的,java,list,session,arraylist,shopping-cart,Java,List,Session,Arraylist,Shopping Cart,最近,我正在尝试用Java会话编写购物车。我使用列表对象来存储产品,然后存储在会话中。当用户更改产品的数量时,我使用下面的代码尝试更新会话。它确实有效,因为当我刷新页面时,购物车图标旁边显示的数字发生了变化,但我真的不知道它是如何工作的。谁能帮帮我吗 以下是用户取消某个特定产品时的代码,我只是将其从列表中删除: List<OrderProduct> orderProductList = (ArrayList<OrderProduct>)session.getAttribu

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

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); 
        }
    }

但是当我在jsp中检索会话时,存储在会话中的对象被更改,它是如何工作的

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

SomeObj obj = new SomeObj();
Map<String, SomeObj> map = HashMap();
map.put("key", obj);
SomeObj o2 = map.get("key");
o2.setProperty("foo");
SomeObj obj=新的SomeObj();
Map Map=HashMap();
地图放置(“键”,obj);
SomeObj o2=map.get(“key”);
o2.setProperty(“foo”);

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

什么课程?这显然不仅仅是一个Java问题。请指定您正在使用的软件堆栈?您在迭代时正在修改
列表(
orderProductList.remove(i);
)。你应该使用迭代器。@Titus为什么我要使用迭代器?我只使用for循环。我做
orderProductList.remove(I)是因为我想从列表中删除它看看这个@Titus它实际上不能像问题描述的那样失败-没有迭代器与集合不同步。这仍然是错误的,因为它最终跳过了列表项。这是因为当我设置会话属性
session.setAttribute('orderProductList',list)
时,我将会话命名为“orderProductList”,当我检索会话时,我使用名为“orderProductList”的列表来建立连接吗?@hayley No,它在会话上创建了一个名为“orderedProductList”的属性,该属性映射到您的列表。当您再次请求属性时,会得到相同的列表。更改列表不会更改映射,会话仍保留“orderProductList”->yourlistInstance。不管您对列表做了什么修改,映射都会得到维护。谢谢您的帮助!
SomeObj obj = new SomeObj();
Map<String, SomeObj> map = HashMap();
map.put("key", obj);
SomeObj o2 = map.get("key");
o2.setProperty("foo");