У меня есть страница Facelets с a <h:dataTable>
. В каждой строке существует a <h:selectBooleanCheckbox>
. Если флажок устанавливается, объект позади соответствующей строки должен быть установлен в бобе.
<h:selectManyCheckbox>
? Лучше всего связать значение h: selectBooleanCheckbox
со свойством Map
где RowId
представляет тип идентификатора строки. Возьмем, к примеру, объект Item
, свойство идентификатора id
- это Long
:
<h:dataTable value="#{bean.items}" var="item">
<h:column>
<h:selectBooleanCheckbox value="#{bean.checked[item.id]}" />
</h:column>
...
</h:dataTable>
<h:commandButton value="submit" action="#{bean.submit}" />
, которое должно использоваться в сочетании с:
public class Item {
private Long id;
// ...
}
и
public class Bean {
private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();
private List<Item> items;
public void submit() {
List<Item> checkedItems = checked.entrySet().stream()
.filter(Entry::getKey)
.map(Entry::getValue)
.collect(Collectors.toList());
checked.clear(); // If necessary.
// Now do your thing with checkedItems.
}
// ...
}
Видите ли, карта автоматически заполняется идентификатором
всех элементов таблицы в качестве ключа, а значение флажка автоматически устанавливается как значение карты, связанное с идентификатором элемента
как ключ.