Kolejną zaletą jest to, że można uzyskać aktualnie przetwarzanego wiersza przez DataModel#getRowData()
. Jest to szczególnie przydatne, gdy chcesz uzyskać dostęp do bieżącego wiersza podczas zdarzeń (konwersja/sprawdzanie poprawności, detektor zmian wartości, metoda działania itp.).
E.g.
<h:column>
<h:commandButton value="edit" action="#{bean.edit}" />
</h:column>
z
public String edit() {
Item item = dataModel.getRowData();
// ...
}
można znaleźć podstawowy przykład CRUD, który wykorzystuje to w this blog. Jeśli nie używasz DataModel
, będziesz zmuszony do używania f:setPropertyActionListener
dla tego, który jest tylko niezgrabny i nie będzie działać dla odbiorcy/konwertera lub słuchacza zmiany wartości. Od EL 2.2, można również przekazać aktualną var
pozycję jako metoda argumentacji tak:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
z
public String edit(Item item) {
// ...
}
Podczas ładny, to będzie tylko dokonać webapp niezgodne z Java EE 5 pojemników na bazie.
Co do narzutu, "konwersja" z List<T>
na DataModel<T>
jest szczególnie tania. Żadne nowe elementy nie zostały skopiowane lub utworzone, jest to po prostu klasa opakowania, która deleguje metody do zawiniętej klasy i dodaje do niej inne metody (zobacz także adapter pattern).
Czy możemy wywnioskować, że 'DataModel' istnieje tylko dla dwóch funkcji: dla dostarczania informacji o wierszach (nie jest potrzebna w EL 2.2) i dla umożliwienia słuchaczom (zgadnij, że czasami może to być miłe)? Uwaga: użycie EL 2.2 nie powoduje, że aplikacja jest niekompatybilna z kontenerami JEE5 (można ręcznie aktualizować biblioteki EL), ale powoduje to, że aplikacja jest niekompatybilna ze specyfikacją JEE5. –