jsf - ejemplo - ui:repeat index
JSTL c: si no funciona dentro de un JSF h: dataTable (1)
Estoy tratando de usar <c:if>
para poner condicionalmente un <h:outputLink>
dentro de una <h:dataTable>
cuando el estado haya finalizado.
<h:dataTable value="#{bean.items}" var="item" width="80%">
<h:column>
<f:facet name="header">
<h:outputText value="State" />
</f:facet>
<c:if test="#{item.state != ''Finish''}">
<h:outputText value="Missing value" />
</c:if>
<c:if test="#{item.state == ''Finish''}">
<h:outputLink value="myLink">
<h:outputText value="Value = #{item.state}" />
</h:outputLink>
</c:if>
</h:column>
</h:dataTable>
Pero esto no funciona, ¿por qué y cómo puedo solucionarlo?
Las etiquetas JSTL se evalúan durante la construcción de la vista, no durante la representación de la vista. Puede visualizarlo de la siguiente manera: Cada vez que se crea un árbol de vista por primera vez, todas las etiquetas JSTL se ejecutan y el resultado es una vista con solo componentes JSF. Cada vez que se procesa un árbol de vista, todos los componentes JSF se ejecutan y el resultado es HTML. Entonces: JSF + JSTL no se ejecuta en sincronización como cabría esperar de la codificación. JSTL se ejecuta de arriba a abajo, primero entrega el resultado a JSF y luego le toca a JSF correr de arriba a abajo nuevamente. Esto puede llevar a resultados inesperados en la iteración de componentes JSF como UIData porque los datos de la fila (en su caso particular, el objeto #{item}
) no están disponibles mientras se ejecuta JSTL.
En pocas palabras: use JSTL para controlar el flujo de la construcción del árbol de componentes JSF. Utilice JSF para controlar el flujo de generación de salida HTML.
Desea utilizar el atributo rendered
aquí.
<h:outputText value="Missing value" rendered="#{item.state ne ''Finish''}" />
<h:outputLink value="myLink" rendered="#{item.state eq ''Finish''}">
<h:outputText value="Value = #{item.state}" />
</h:outputLink>