JSTL добавляет новый элемент в 2D-массив с вложенным c: forEach, что приводит к неправильной итерации массива - PullRequest
0 голосов
/ 31 октября 2019

У меня есть двумерный символьный массив с переменным размером, который я хочу отобразить в двумерной сетке. Я сделал это с помощью вложенного c: forEach. Начальный дисплей в порядке. Дисплей стал ошибочным после добавления нового элемента в любой из массивов и обновления дисплея. Я использую сервер Glassfish 4.1.2 с java 8 и PrimeFace 7.0.

Я попытался заменить его на ui: repeat. Однако, поскольку я намерен реализовать манипуляцию с помощью перетаскивания по дороге, идентификаторы должны быть известны, а не генерироваться, как в случае с ui: repeat. Я попытался добавить process = "@ parent" в commandButton, это неэффективно. Я также изменил с # на $, также без разницы.

@Named
@SessionScoped
public class TestMB implements Serializable {
    private static final long serialVersionUID = 1L;

    private ArrayList<ArrayList<Character>> testData = new ArrayList<ArrayList<Character>>();

    public TestMB() {
    }

    @PostConstruct
    private void init() {
        ArrayList<Character> i1 = new ArrayList<Character>();
        i1.add('a');
        i1.add('b');
        i1.add('c');
        ArrayList<Character> i2 = new ArrayList<Character>();
        i2.add('d');
        i2.add('e');
        ArrayList<Character> i3 = new ArrayList<Character>();
        i3.add('f');
        i3.add('g');
        i3.add('h');
        i3.add('j');
        this.testData.add(i1);
        this.testData.add(i2);
        this.testData.add(i3);
    }

    public ArrayList<ArrayList<Character>> getData() {
        return this.testData;
    }

    public void insert() {
        this.testData.get(0).add(2, 'i');
    }
}
<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:pf="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
    <pf:panelGrid id="testGrid">    
        <c:forEach var="row" items="#{testMB.getData}">
            <pf:row>
                <c:forEach var="letter" items="#{row}">
                    <pf:column>
                        <pf:outputLabel value="#{letter}" style="display: inline" />
                    </pf:column>
                </c:forEach>
            </pf:row>
        </c:forEach>
    </pf:panelGrid>
    <pf:commandButton value="test" actionListener="#{testMB.insert()}" update="topForm:testGrid" />
</ui:composition>

Начальное отображение:
abc
de
fghj
, что является правильнымотобразить. После нажатия кнопки проверки и активации вставки (). На дисплее появится:
abic
ee
hjj
Что является ошибочным. Однако, если я уйду со страницы и вернусь, дисплей изменится на:
abic
de
fghj
, что является правильным отображением. Я подозреваю, что это происходит потому, что при начальной загрузке и обратной передаче информация обрабатывается по-разному, но я не уверен, как исправить эту проблему, чтобы при обратной передаче корректно отображался дисплей.

...