为什么我的列表需要会话中的空列表才能显示添加到该列表的所有项目?

Why does my list need an empty list from session in order to show all the items added to that list?

背景:

我正在解决一个问题,我根据按下的按钮随机生成一个结果。我正在使用 Java 控制器和 JSP & JSTL。我不得不四处寻找我找到的解决方案,但是在尝试理解该解决方案时,我遇到了一个非常困难的时间,我将在下面粘贴其中的一部分。请注意,以下只是给我带来问题的基本部分的摘录,实际代码运行良好。当我没有掌握它的工作原理时,我试图弄清楚它是如何工作的:

在控制器中:

public String Index(HttpSession session){
    if(session.isNew()){
        **ArrayList<> logList2 = new ArrayList<>();
        session.setAttribute(“actionJournal”, logList2);**
    }
    return “index2.jsp”;
}

public String Form(HttpSession session){

    if(val == 1){
        **ArrayList<String> list1 = (ArrayList<String>) session.getAttribute(“actionJournal”);**
        list1.add(0, “yo yo yo”);
        session.setAttribute(“logList”, list1);
    }

    if(val == 2){
        ArrayList<> list2 = (ArrayList<>) session.getAttribute(“actionJournal”);
        list2.add(0, “ha ha ha”);
        session.setAttribute(“logList”, list2);
    }
    return “redirect:/“;
}

在index2.jsp中:

<c:forEach items=“${logList}" var="event">
    <c:out value=“${event} escapeXml=“false”/>
</c:forEach>

当我 运行 代码时会发生什么: 当我第一次访问主页时,计数器为 0(不包括在上面的代码中)并且最初没有显示任何消息,但是当我单击一个按钮时,计数器会根据一个随机数(不包括在上面的代码),屏幕上会显示一条消息,告诉我我输了钱或赚了钱(上面代码中的消息用 yo yo yo 或 ha ha ha 表示)。当我再次单击同一个按钮或另一个按钮时,计数器会发生另一个随机变化以及一条新消息,这些消息会相互堆积(因此您可以获得所有消息的 activity 日志) --> 这由我粘贴在控制器代码下方的 index2.jsp 代码中的 forEach 循环表示。 这是期望的结果。我没有得到的是如何解决方案设法获取所有消息的日志。

我特别困惑的是: 上面代码中我放在星号中的部分是,如果我以其他方式更改它们,会导致显示的消息删除之前存在的消息的部分。也就是说,它不再记录我到那时为止的所有操作,而只显示最近出现的消息。我将其缩小到那些代码行,因为当我更改其他所有内容时,程序仍然可以正常运行。

我不明白为什么 list1 或 list2 需要 = (ArrayList) session.getAttribute("actionJournal") 当它看起来不像 actionJournal 甚至原始数组列表 logList2 时得到更新按下一个按钮,只有 list1 或 list2。我认为它与 session.isNew() 有关 --> 但我无法确定任何事情。

在我看来,actionJournal 代表一个空列表 (logList2),并且每次生成 list1 或 list2 时,它都是从一个空列表继承的。但它有效。但是当我设置 list1 或 list2 = new ArrayList() 时,它只显示最近的消息而不是整个消息日志。

如果我没理解错的话,您不确定为什么您的邮件列表在增长,而不是每次都被新列表替换。

你拥有的是 session 变量。这些变量在会话期间存在。

if(session.isNew()){
        ArrayList<> logList2 = new ArrayList<>();
        session.setAttribute(“actionJournal”, logList2);
}

所以在这里,你说的是添加一个 actionJournal,即 ArrayList

然后这里:

(ArrayList<>) session.getAttribute(“actionJournal”);

你是说得到我之前创建的相同actionJournal

The way it looks to me is that actionJournal is representing an empty list (logList2), and that each time list1 or list2 is generated, it's inheriting from an empty list.

不,这是不正确的。首先,没有任何形式的继承。每次点击 public String Form(HttpSession session) 时,您都在检索完全相同的列表。 list1list2 永远不会生成。它们始终是在 public String Index(HttpSession session) 中创建的相同列表,因为您正在检索会话属性 actionJournal

事实上,您有一些多余的代码。这是相同的功能:

...

if(session.isNew()){
    ArrayList<> logList2 = new ArrayList<>();
    session.setAttribute(“logList”, logList2);
}

...

ArrayList<> actionJournal = (ArrayList<>)session.getAttribute(“logList”);
if(val == 1){
    list1.add(0, “yo yo yo”);
}
if(val == 2){
    list2.add(0, “ha ha ha”);
}

请注意,您甚至不需要设置会话属性,因为您正在修改已经是会话属性的内容。