Ответ 1
Еще одно преимущество заключается в том, что вы можете получить обработанную в настоящий момент строку DataModel#getRowData()
. Это особенно полезно, когда вы хотите получить доступ к текущей строке во время событий (преобразование/валидация, прослушиватель изменения значений, метод действий и т.д.).
например.
<h:column>
<h:commandButton value="edit" action="#{bean.edit}" />
</h:column>
с
public String edit() {
Item item = dataModel.getRowData();
// ...
}
Вы можете найти базовый пример CRUD, который использует это в этом блоге. Если вы не использовали DataModel
, вам пришлось бы использовать f:setPropertyActionListener
для этого, который был бы неуклюжим и не будет работать для приемника валидатора/конвертора или изменения значения. Поскольку EL 2.2, вы также можете передать текущий элемент var
в качестве аргумента метода следующим образом:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
с
public String edit(Item item) {
// ...
}
В то время как это приятно, это сделало бы ваш webapp несовместимым с контейнерами на основе Java EE 5.
Что касается накладных расходов, то "конверсия" от List<T>
до DataModel<T>
является особенно дешевой. Никакие новые элементы не копируются и не создаются или нет, это просто класс-оболочка, который делегирует методы обернутому классу и добавляет к нему другие методы (см. Также адаптер шаблон).