example ejemplo column jsf datatable loading getter

jsf - ejemplo - Cómo y cuándo debo cargar el modelo de la base de datos para h: dataTable



jsf datatable (1)

Tengo una tabla de datos de la siguiente manera:

<h:dataTable value="#{bean.items}" var="item">

Me gustaría rellenarlo con una colección de la base de datos obtenida de un método de servicio para que se presente inmediatamente cuando se abre la página durante una solicitud inicial (GET). ¿Cuándo debo llamar al método de servicio? ¿Y por qué?

  1. Llámalo antes de que se cargue la página. ¿Pero cómo?
  2. Llámalo durante la carga de la página. ¿Cómo?
  3. Llámalo en el método getter. Pero se llama varias veces.
  4. ¿Algo más?

Hazlo en el método @PostConstruct de @PostConstruct .

@ManagedBean @RequestScoped public class Bean { private List<Item> items; @EJB private ItemService itemService; @PostConstruct public void init() { items = itemService.list(); } public List<Item> getItems() { return items; } }

Y deje que el value haga referencia a la propiedad (¡no al método!).

<h:dataTable value="#{bean.items}" var="item">

En @PostConstruct tiene la ventaja de que se ejecuta después de la construcción y la inyección de dependencia. Entonces, en caso de que esté usando un EJB para hacer la tarea de interacción de DB, un @PostConstruct definitivamente sería el lugar correcto ya que las dependencias inyectadas no estarían disponibles dentro de un constructor normal. Además, cuando se utiliza un marco de gestión de beans que utiliza proxies, como CDI @Named , el constructor puede llamarse o no de la manera esperada. Se puede invocar varias veces durante la inspección de la clase, la generación del proxy y / o la creación del proxy.

Al menos no realice el trabajo de interacción de DB en el getter, a menos que sea una carga diferida y realmente no puede hacer nada más. A saber, se invocaría durante cada ronda de iteración. Llamar al método de servicio durante cada ronda de iteración es completamente ineficiente y puede terminar en efectos secundarios "extraños" durante la presentación y las devoluciones, como los valores anteriores de DB que aparentemente todavía se quedan en el modelo en lugar de los nuevos valores enviados.

Si confía en los parámetros de solicitud GET, utilice en su lugar <f:viewParam> y <f:viewAction> . Si desea conservar el modelo (la propiedad de los items ) en las devoluciones en la misma vista (por ejemplo, la tabla / diálogo CRUD), haga que el bean @ViewScoped .

Ver también: