【问题标题】:How does Java session work when I change the object更改对象时 Java 会话如何工作
【发布时间】:2015-09-30 13:50:58
【问题描述】:

最近,我正在尝试使用 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中检索会话时,会话中存储的对象发生了变化,它是如何工作的?

【问题讨论】:

  • 什么会话?这显然不仅仅是一个 Java 问题。请说明您使用的是什么软件堆栈?
  • 您在迭代 List (orderProductList.remove(i);) 时对其进行了修改。您应该为此使用Iterator
  • @Titus 为什么我应该使用迭代器?我只是使用 for 循环。而我这样做orderProductList.remove(i);是因为我想从列表中删除它
  • @Titus 它实际上不会以问题描述的方式失败 - 没有迭代器与集合不同步。它仍然是错误的,因为它最终会跳过列表项。

标签: java list session arraylist shopping-cart


【解决方案1】:

您可以将HttpSession 视为一种每个用户的Map,servlet 容器为您跨请求维护。启动会话后,容器会生成一个唯一的 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。

【讨论】:

  • 这是因为当我设置会话属性 session.setAttribute('orderProductList', list) 时,我将会话命名为“orderProductList”,而当我检索会话时,我使用了一个名为“orderProductList”的列表来建立连接?
  • @hayley 不,它在会话上创建了一个名为“orderedProductList”的属性,映射到您的列表。当您再次请求该属性时,您会得到相同的列表。更改列表不会更改映射,会话仍保留到“orderProductList”-> yourlistInstance。无论您对列表进行何种修改,映射都会保持不变。
  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2016-01-07
  • 2011-02-26
相关资源
最近更新 更多