Un altro vantaggio è che è possibile ottenere la riga correntemente elaborato da DataModel#getRowData()
. Ciò è particolarmente utile quando si desidera accedere alla riga corrente durante gli eventi (conversione/convalida, listener di modifica del valore, metodo di azione, ecc.).
E.g.
<h:column>
<h:commandButton value="edit" action="#{bean.edit}" />
</h:column>
con
public String edit() {
Item item = dataModel.getRowData();
// ...
}
Si può trovare un esempio CRUD che utilizza questo this blog. Se non stava usando DataModel
, si sarebbe costretti ad usare f:setPropertyActionListener
per questo che è goffo e non funzionerà per un validatore/convertitore o modifica del valore ascoltatore. Dal EL 2.2, si potrebbe anche passare il var
elemento corrente come metodo di discussione in questo modo:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
con
public String edit(Item item) {
// ...
}
Mentre bello, questo sarebbe solo rendere il vostro webapp incompatibile con Java EE 5 contenitori basati.
Per quanto riguarda l'overhead, la "conversione" da List<T>
a DataModel<T>
è particolarmente economica. Nessun nuovo elemento è stato copiato o creato o così, è solo una classe wrapper che delega i metodi alla classe spostata e aggiunge altri metodi (vedi anche lo adapter pattern).
Possiamo concludere che il 'DataModel' esiste solo per due funzioni: per fornire informazioni di riga (non necessarie con EL 2.2) e per consentire gli ascoltatori (suppongo che potrebbe essere carino qualche volta)? Una nota: l'uso di EL 2.2 non rende l'applicazione incompatibile con i contenitori JEE5 (è possibile aggiornare manualmente le loro librerie EL), tuttavia rende l'applicazione incompatibile con le specifiche JEE5. –