首页 > 解决方案 > 为什么我的列表需要会话中的空列表才能显示添加到该列表中的所有项目?

问题描述

背景:

我正在解决一个问题,我根据按下的按钮随机生成结果。我正在使用 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 或 haha​​ ha 表示)。当我再次单击同一个按钮或另一个按钮时,计数器中会发生另一个随机变化以及一条新消息,并且这些消息相互堆积(因此您可以获得所有消息的活动日志)-> this由我粘贴在控制器代码下方的 index2.jsp 代码中的 forEach 循环表示。这是期望的结果。我不明白的是如何该解决方案设法获取所有消息的日志。

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

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

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

标签: javajsptomcatjstl

解决方案


如果我理解正确,您不确定为什么您的消息列表正在增长,而不是每次都被新列表替换。

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

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

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

那么这里:

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

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

在我看来,actionJournal 代表一个空列表(logList2),并且每次生成 list1 或 list2 时,它都继承自一个空列表。

不,这是不正确的。首先,没有任何形式的继承。每次点击 时,您都在检索完全相同的列表public String Form(HttpSession session)list1并且list2永远不会生成。它们始终是在其中创建的相同列表,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”);
}

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


推荐阅读