У меня есть ap: dataTable. Содержит список предметов. Элементы принадлежат классу Item.java, который является классом Java-бина. Он имеет 3 атрибута: идентификатор (целое число, уникальный идентификатор), имя (строка), значение (целое число), методы получения и установки. У таблицы данных есть 3 столбца:
название элемента
значение элемента
p:commandButton со значением «Изменить»;при нажатии на кнопку отображается диалоговое окно ap :, которое содержит сообщение (вы хотите обновить # {i.name}), h: inputText, где мне нужно ввести новое значение, и кнопку подтверждения. Когда я нажимаю «submit», он вызывается методом «changeValue (Item item)» из класса ItemsView.java.
В этот момент таблица p: datatable содержит 3 элемента: «item1», «item2», «item3», и все они имеют значение 0. Я хочу обновить «item2»со значением "5". Когда вызывается метод "changeValue (Item item)", этот элемент является правильным, но значение по-прежнему равно 0, а обновление не выполняется.
Вот страница xhtml и класс Java:
<h:body>
<h:form id="listItemsForm" prependId="false">
<p:dataTable id="itemEntitiesTable" var="i" value="#{itemsView.items}">
<p:column headerText="Name">
<h:outputText value="#{i.name}" />
</p:column>
<p:column headerText="Value">
<h:outputText value="#{i.value}" />
</p:column>
<p:column headerText="Update value">
<p:commandButton value="Change" onclick="PF('changeValue#{i.id}').show();" >
<f:setPropertyActionListener target="#{itemsView.selectedItem}" value="#{i}"/>
</p:commandButton>
<p:dialog header="Update value" widgetVar="changeValue#{i.id}" modal="true" height="150" >
You want to update #{i.name}
<br/><br/>
<h:outputLabel value="New value: * " />
<h:inputText id="itemValue" required="true" label="itemValue" value="#{i.value}" />
<br/><br/>
<h:commandButton type="submit" id="updateItem" value="Change" action="#{itemsView.changeValue(i)}" />
</p:dialog>
</p:column>
</p:dataTable>
</h:form>
</h:body>
И класс Java, связанный с dataTable:
@ManagedBean
@ViewScoped
public class ItemsView implements Serializable {
private List<Item> items;
@ManagedProperty("#{selectedItem}")
private Item selectedItem;
@PostConstruct
public void init() {
items = // a list of 3 items - ("item1", 0), ("item2", 0), ("item3", 0)
}
// getters and setters
public String changeValue(Item item) {
System.out.println(item.getName()); // name of the selected item, which is correct
System.out.println(item.getValue()); // 0 (the old value, not 5, as I expected)
// some code, to persist the new value in database, not relevant for this question
return "success";
}
}
Для меня область действия в этот момент - когда я меняю значение для элемента с 5, строка «Система».out.println (item.getValue ());»будет отображаться «5». По причинам бизнес-логики я не хочу изменять значение непосредственно в ячейке (без p: диалогового окна).