Почему мой список нуждается в пустом списке из сеанса, чтобы показать все элементы, добавленные в этот список? - PullRequest
0 голосов
/ 25 февраля 2020

Справочная информация:

Я работаю над проблемой, в которой я случайным образом генерирую результат на основе нажатых кнопок. Я использую 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:/“;
}

В индексе 2. jsp:

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

Что происходит, когда я запускаю код: при первом посещении домашней страницы счетчик равен 0 (не входит в приведенный выше код), и сообщения изначально не отображаются, но когда я нажимаю кнопка, счетчик изменяется вверх или вниз на основе случайного числа (не включенного в приведенный выше код), и на экране отображается сообщение о том, что я либо потерял, либо получил деньги (сообщение в коде выше обозначено как йо йо или ха ха ха). Когда я снова нажимаю ту же кнопку или другую, происходит другое случайное изменение в счетчике вместе с новым сообщением, и эти сообщения накладываются друг на друга (так что вы можете получить журнал активности всех сообщений) -> это представлен кодом forEach l oop в index2. jsp коде, который я вставил ниже кода контроллера. Это желаемый результат. То, что я не получаю, это как решению удается получить журнал всех сообщений.

Что меня особенно смущает about: Части в приведенном выше коде, которые я вставил в звездочки, являются частями, которые, если я изменил их каким-либо другим способом, приводят к тому, что появляющиеся сообщения удаляют сообщение, которое было там ранее. То есть он больше не хранит журнал всех моих действий до этого момента и показывает только самое последнее сообщение, которое должно появиться. Я сузил его до тех строк кода, потому что, когда я изменил все остальное, программа все еще работала правильно.

Я не могу gr asp, почему list1 или list2 должны = (ArrayList) session.getAttribute ( «actionJournal»), когда это не похоже на actionJournal или даже оригинальный список массивов logList2 обновляется при нажатии кнопки, только list1 или list2. Я думаю, что это как-то связано с session.isNew () ->, но я ничего не могу понять.

Мне кажется, что actionJournal представляет пустой список (logList2), и что каждый раз, когда генерируется list1 или list2, он наследуется от пустого списка. Все же это работает. Но когда я устанавливаю list1 или list2 = new ArrayList (), он показывает только самые последние сообщения, а не весь журнал сообщений.

1 Ответ

1 голос
/ 25 февраля 2020

Если я правильно понимаю, вы не уверены, почему ваш список сообщений растет, а не заменяется новым списком каждый раз.

Что у вас есть сессия переменные. Эти переменные существуют на время сеанса.

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

Обратите внимание, что вам даже не нужно устанавливать атрибут сеанса, потому что вы изменяете то, что уже является атрибутом сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...