jsf-2 - template - ui define jsf
c: elige no trabajar en JSF (2)
Tengo tres valores y quiero que se represente un componente en el caso de los dos primeros valores y otro componente para el tercer valor
A continuación, tengo mi página:
page.xhtml
<ui:repeat value=#{bean.value} var="data">
<c:choose>
<c:when test="#{data.thirdValue == ''content''}">
<h:outputText value="Wrong value"/>
</c:when>
<c:otherwise>
Correct!
</c:otherwise>
</c:choose>
</ui:repeat>
Así es como mi página está definida. También he agregado el siguiente espacio de nombre: xmlns:c="http://java.sun.com/jsp/jstl/core
.
Probé si el valor definido en la prueba para <c:when>
devuelve "verdadero" o "falso" y lo hace.
Mi problema es que <c:when>
nunca se evalúa. El valor <c:otherwise>
siempre se representa. ¿Me estoy perdiendo de algo? ¿Es debido a que la representación condicional está dentro de <ui:repeat>
que el cuándo no se evalúa?
Cualquier ayuda será muy apreciada. Gracias por adelantado
Debe eliminar la c: elegir, porque como @Jens declaró en los comentarios, se procesan en diferentes fases. Puede usar JSTL en conjunto con JSF, pero debe respetar el orden en que se resuelven. lee las buenas respuestas de BalusC, él mece.
En cuanto a sus necesidades, puede usar el atributo renderizado , para dar salida condicionalmente a su texto:
<ui:repeat value="#{bean.value}" var="data">
<h:outputText rendered="#{data.thirdValue == ''content''}" value="Wrong value"/>
<h:outputText rendered="#{data.thirdValue != ''content''}" value="Correct!"/>
</ui:repeat>
Solo para agregar a la respuesta de Mindwin, debe comprender que <c:choose>
es un controlador de etiquetas, cuando <ui:repeat>
es un componente de UI. El primero se evalúa mientras se construye el árbol de componentes, y el segundo, mientras se está representando la vista, es decir, en un momento posterior. Desde este punto de vista, la dependencia de var
de <ui:repeat>
es lo que está mal con tu código, ya que no se ha evaluado cuando <c:choose>
entra en juego.
Hay dos cosas para recordar aquí.
Use un controlador de etiquetas iterativo, <c:forEach>
, con sus contenidos:
<c:forEach items=#{bean.values} var="data">
<c:choose>
<c:when test="#{data.thirdValue == ''content''}">
<h:outputText value="Wrong value"/>
</c:when>
<c:otherwise>
Correct!
</c:otherwise>
</c:choose>
</c:forEach>
Con este enfoque, ambas etiquetas se ejecutan al mismo tiempo (se está construyendo la vista), por lo que los conflictos no se producirán. Solo recuerde que en caso de que su bean tenga un alcance de vista, se volverá a crear en cada solicitud.
Use el componente UI con el atributo rendered
:
<ui:repeat value=#{bean.values} var="data">
<h:outputText rendered="#{data.thirdValue == ''content''}" value="Wrong value"/>
<ui:fragment rendered="#{data.thirdValue != ''content''}">
<h1>Correct</h1>
</ui:fragment>
</ui:repeat>
En este caso, todo se ejecuta al mismo tiempo (se está visualizando). Tenga en cuenta que puede procesar un montón de HTML con, por ejemplo, <ui:fragment>
, así como ciertas etiquetas JSF como <h:outputText>
, utilizando un atributo rendered
.
En definitiva, adelante con la publicación clásica: JSTL en JSF2 Facelets ... ¿Tiene sentido? , para obtener una comprensión completa de la relación entre los controladores de etiquetas y los componentes de la interfaz de usuario.