JSF 2.0: почему объект в моем списке (кроме последнего) не может быть обновлен

#java #list #jsf-2

#java #Список #jsf-2

Вопрос:

В моем коде у меня есть следующие объекты для реализации корзины покупок:

 public class CartItem {
    ...
    public int id;
    public int quantity;
    ...
}

public class Partner {
    ...
    public List<CartItem> listOfItems;
    ...
}

public class Cart implements Serializable {
    ...
    private List<Partner> listOfPartners;
    ...
}
  

На странице ViewCart.xhtml я перечисляю элементы следующим образом:

 ...
<ui:repeat value="#{cartManagedBean.cart.listOfPartners}" var="p">
    <ui:repeat value="#{p.listOfItems}" var="i">
        <h:form>
            ...
            <h:inputText size="3" value="#{i.quantity}" />

            <h:commandButton value="Update" />
            ...
        </h:form>
    </ui:repeat>
</ui:repeat>
...
  

И это мой ManagedBean:

 @ManagedBean
@SessionScoped
public class CartManagedBean {
    ...
    private Cart cart;
    ...
}
  

Все методы получения и установки выполнены правильно. Следовательно, я ожидал, что при нажатии кнопки обновить количество соответствующего элемента будет обновлено. Однако, когда я тестирую функцию, может быть обновлен только последний элемент в списке.

Я был бы очень признателен, если бы кто-нибудь мог дать мне совет о том, как мне следует решить эту проблему.

ОБНОВЛЕНИЕ: мне удалось заставить его работать, заменив ui:repeat на h:dataTable . Я думаю, что мои знания о ui:repeat где-то ошибочны. Когда я использовал ui:repeat , я увидел, что сгенерированный HTML-код был чем-то вроде:

 <form>
    ...
    <input type="submit" id="jdt:51;jdt52" />
    ...
</form>
<form>
    ...
    <input type="submit" id="jdt:51;jdt52" />
    ...
</form>
  

Другими словами, все элементы были сгенерированы с одинаковым идентификатором. Я даже пытался сделать идентификатор ввода для количества уникальным, добавив уникальный идентификатор каждого элемента к идентификатору ввода следующим образом:

 <h:inputText id="quantity#{i.id}" size="3" value="#{i.quantity}" />
  

Однако в результате HTML я увидел, что идентификатор был чем-то вроде:

 <form>
    ...
    <input type="submit" id="jdt:51;jdt52;quantity203" />
    ...
</form>
<form>
    ...
    <input type="submit" id="jdt:51;jdt52;quantity203" />
    ...
</form>
  

Другими словами, идентификатор 1-го элемента был повторен для всех последующих элементов. Хотя я не совсем понял, как переменные обновляются новыми значениями, я думаю, что это причина, по которой может быть обновлен только последний элемент.

Я был бы очень признателен, если бы кто-нибудь мог объяснить мне это подробнее, чтобы я не повторил ту же ошибку снова =).

Комментарии:

1. <h:commandButton value="Update" /> здесь вы вызываете какой-то метод?

2. @BheshGurung: нет, я не вызываю здесь никакого метода. Я просто хочу обновить переменные, не делая никаких дополнительных действий.

Ответ №1:

Похоже, вы используете Mojarra. <ui:repeat> Полностью сломан в Mojarra. Я могу воспроизвести вашу проблему даже в последней версии Mojarra 2.1.4. Однако она работает на 100% при использовании MyFaces 2.1.3. Я сообщил об этом ребятам из Mojarra как о проблеме 2243.

У вас есть 3 варианта:

  • Замените Mojarra на MyFaces.
  • Используйте <c:forEach> вместо <ui:repeat> . Это работает только в том случае, <c:forEach> если он не находится сам по себе внутри какого-то UIData компонента.
  • Используйте UIData компонент вместо <ui:repeat> .

Комментарии:

1. Как всегда, я думаю, вы попали прямо в мою проблему. В данный момент я действительно использую Mojarra. Однако для меня уже слишком поздно меняться. Я только вчера отправил свой проект. Я отмечу это для будущего проекта =].