Otra ventaja es que se puede obtener de la fila actualmente procesado por DataModel#getRowData()
. Esto es particularmente útil cuando quiere acceder a la fila actual durante los eventos (conversión/validación, detector de cambio de valor, método de acción, etc.).
E.g.
<h:column>
<h:commandButton value="edit" action="#{bean.edit}" />
</h:column>
con
public String edit() {
Item item = dataModel.getRowData();
// ...
}
puede encontrar un ejemplo básico CRUD que utiliza esto en this blog. Si no estaba usando DataModel
, se le forzaría a usar f:setPropertyActionListener
para esto, que es solo torpe y no funcionará para un validador/convertidor o detector de cambio de valor. Desde EL 2.2, también se puede pasar el elemento actual var
como argumento de un método de este modo:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
con
public String edit(Item item) {
// ...
}
Mientras agradable, esto sólo haría que su aplicación web incompatible con contenedores basados en Java EE 5.
En cuanto a los gastos generales, la "conversión" de List<T>
a DataModel<T>
es particularmente barata. No se han copiado ni creado nuevos elementos, es solo una clase contenedora que delega los métodos a la clase envolvente y le agrega otros métodos (ver también adapter pattern).
¿Podemos concluir que el 'DataModel' existe solo para dos funciones: para proporcionar información de filas (no necesaria con EL 2.2) y para permitir oyentes (supongo que esto podría ser bueno a veces)? Una nota: el uso de EL 2.2 no hace que la aplicación sea incompatible con los contenedores JEE5 (puede actualizar manualmente sus bibliotecas EL), sin embargo, hace que la aplicación sea incompatible con la especificación JEE5. –