Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > [JSF 2.1] commandButton dentro de dataTable

Buenos días a todos.

Estoy teniendo problemas con commandButton y commandLinks dentro de los dataTables.

La idea es tener un CRUD, con un listado de elementos, y un botón (Editar) y otro (Eliminar) en la última columna de la tabla.

Pero al pulsar sobre cualquiera de los commandButton, ¡no hace nada!.

¿Os ha ocurrido alguna vez?. En otros proyectos si he visto commandButtons dentro de tablas...

Estoy usando JSF 2.1, copio el código usado:

<h:column id="acciones" headerClass="ui-state-default">
<f:facet name="header">
<h:outputText value="#{commonProp.lblAcciones}" />
</f:facet>

<div class="acciones-lista">
<h:commandLink action="#{miBean.editar}" type="submit" value="#{commonProp.lblEditar}" immediate="true">
<f:setPropertyActionListener target="#{miBean.entidad}" value="#{puesto}"/>
</h:commandLink>
<h:commandLink action="#{miBean.eliminar}" type="submit" value="#{commonProp.lblEliminar}">
<f:setPropertyActionListener target="#{miBean.entidad}" value="#{puesto}"/>
</h:commandLink>
</div>
</h:column>

Donde value="#{puesto}" es el atributo "var" del dataTable. Es que no quiero hacer el típico radiobutton en la tabla para tener que seleccionar el elemento, y poner las acciones directamente al lado de cada entidad.

¿Os ha ocurrido alguna vez?.

Un saludo y muchas gracias.

febrero 25, 2013 | Unregistered Commentermayantigo

¿Cuando dices "no hace nada" te refieres a que el action handler no es invocado? Si es así, ¿Tienes el componente <h:dataTable/> dentro de tags <h:form ../>? Incluso creo que de no tenerlo así estarías obteniendo un error en la página. ¿Qué "scope" tiene el backing bean?

Como comentarios adicionales: Si después de invocar el commandLink no vas a pasar a otra página, utiliza actionListener="..." en lugar de action="...". De esa forma podrás utilizar PPR (partial page rendering) con tags <f:ajax />.

El valor de #{puesto} lo puedes evaluar directamente en el action handler:

FacesContext fc = FacesContext.getInstance();
Application app = fc.getApplication();
ExpressionFactory ef = app.getExpressionFactory();
ELContext elc = fc.getELContext();

ValueExpression ve = ef.createValueExpression(elc, "#{puesto}", Object.class);
Object valor = ve.getValue(elc);

Parece mucho circo pero a veces es bastante útil.

febrero 25, 2013 | Registered Commenterantoniovl

También te podría servir poner en la página de manera temporal un <h:messages .../> con globalOnly falso y showDetail con verdadero.

febrero 25, 2013 | Registered Commenterantoniovl

porque no pruebas usar primefaces

febrero 25, 2013 | Registered Commenteringscjoshua

Gracias por vuestras respuestas.

He estado probándolo y mirando documentación y demás. Y creo que he encontrado el problema. Es un "bug" de JSF 2.1. Si el action del commandButton que está dentro de un dataTable tiene scope Request, no funciona.
Para que funcione, el backing bean debe tener o bien ViewScope, o bien SessionScope, ya que al renderizar la tabla los RequestScope no existen aún.

He puesto el backing bean como ViewScope y listo, así funciona. He encontrado más problemillas (¡pondré otro post con ellos!). Prefiero usar los Request, pero bueno... no se que impacto puede tener poner los backing beans en ViewScope.

Así que si os pasa alguna vez... mirad los scopes de vuestros beans.

ingscjoshua, en principio no quiero usar ninguna librería adicional. Estoy usando JSF 2.1 con algunos plugins de JQuery. Y creo que el problema que comento con los RequestScope lo sufre también Primefaces... (por lo que he visto en los foros y eso).

Muchísimas gracias por vuestros comentarios y vuestra ayuda.

¡Un saludo!.

febrero 26, 2013 | Unregistered Commentermayantigo

Ok, mira el scope de view esta genial si vas a usar ajax ya que los datos se mantienen persistentes, mientras no navegues a otra pagina ese es el objetivo del scope view ami me parece realmente genial que sea nativo en jsf, ya que antes tenias que hacer otras cosas para usar ajax con jsf 1.2 precisamente para evitar hacer cosas raras :)

febrero 26, 2013 | Registered Commenteringscjoshua