¿Cómo agregar dinámicamente una fila en una tabla en JSF?

En mi aplicación, necesito agregar una fila al hacer clic en un botón y este botón estará en todas las filas. ¿Necesitas ayuda para hacer esto?

Clase de artículo

public class Item { public Item() { } private String value; public Item(String value) { this.value = value; } public void setValue(String value) { this.value = value; } public String getValue() { return value; } } 

Administrar la clase Bean

 public class MyMB { private List list; public void addItem() { // JSF action method list.add(new Item("Default")); Iterator iterator = list.iterator(); while(iterator.hasNext()) { Item item = (Item)iterator.next(); System.out.println(item.getValue()); } System.out.println(); } /** * @return the list */ public List getList() { if(list==null) { loadList(); } return list; } private void loadList() { list = new ArrayList(); list.add(new Item("Data")); } } 

Código JSF

     

Todo lo que necesitas hacer es básicamente simplemente agregar un objeto vacío al modelo de datos detrás del atributo de value de h:dataTable .

Pero la misma fila vacía debe conservarse en la solicitud posterior también. Si el bean de respaldo tiene un scope de solicitud, entonces el modelo de datos se vuelve a cargar sin la fila vacía. Todo esto debería funcionar cuando el bean tenga una sesión de scope.

Además, hay varios errores en su código JSF. h:dataTable atributo h:dataTable var y el contenido de la columna debe estar dentro de una h:column .

       

Una sesión o una vista de bean con ámbito puede verse así:

 public class Bean { private List list; public Bean() { list = new ArrayList(); } public void add() { list.add(new Item()); } public List getList() { return list; } } 

Por supuesto, la clase Item debe tener un constructor no-arg por defecto. Normalmente, esto ya está disponible implícitamente, pero si defines tu propio constructor con argumentos, ya no estará disponible. Necesitarás definirlo explícitamente; de ​​lo contrario, no puedes hacer Item item = new Item(); nunca más.

 public class Item { private String value; public Item() { // Keep default constructor alive. } public Item(String value) { this.value = value; } // ... } 

Si prefiere mantener el bean en el scope de la solicitud , deberá mantener la cantidad de elementos recién agregados, para que el bean pueda conservar la misma cantidad en la carga.

 public class Bean { private List list; private HtmlInputHidden count = new HtmlInputHidden(); public Bean() { count.setValue(0); } public void add() { list.add(new Item()); } public List getList() { if (list == null) loadList(); return list; } public HtmlInputHidden getCount() { return count; } public void setCount(HtmlInputHidden count) { this.count = count; } private void loadList() { list = new ArrayList(); // Preserve list with newly added items. for (int i = 0; i < (Integer) count.getValue(); i++) { list.add(new Item()); } } } 

Solo deberá agregar lo siguiente a la de la página JSF:

  

Para obtener más información sobre el uso de tablas de datos de cualquier manera, puede encontrar útil este artículo: Usar tablas de datos . También contiene un archivo WAR con muchos ejemplos tanto en el scope de la solicitud como en el de la sesión.

Tome esta tabla como un ejemplo:

  ...     

El método myBean.addRow simplemente agregará un nuevo elemento en su lista:

 public class MyBean { private List list; ... public List getList() { return list; } public void addRow() { list.add(new SomeClass()); } } 

Cuando haga clic en el botón, el método addRow agregará un nuevo elemento en la lista . La página actualizará y mostrará la tabla con una nueva fila.

Editar:

En cuanto a su publicación posterior, tres cosas:

Punto 1: ¿podría adjuntar el stacktrace de su error?

Punto 2: Su método addRow devuelve una String que es una ID utilizada por JSF para la navegación. Como esta acción no implica ninguna navegación (es decir, el usuario permanece en la misma página), simplemente devuelva null o "" :

 public String addRow() { list.add(new Item("new data")); return null; } 

Punto 3: sugiero que su Item clase proporcione un constructor vacío (además de su constructor actual):

 public Item() { } 
    Intereting Posts