c:选择不在JSF中工作

sci*_*iFi 8 jstl primefaces jsf-2

我有三个值,我希望在前两个值的情况下渲染一个组件,为第三个值渲染另一个组件

下面,我有我的页面:

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>
Run Code Online (Sandbox Code Playgroud)

这就是我的页面定义方式.我还添加了以下命名空间:xmlns:c="http://java.sun.com/jsp/jstl/core.

我测试了测试中定义的值是否<c:when>返回"true"或"false"并且确实如此.

我的问题是<c:when>永远不会评估.<c:otherwise>始终呈现该值.我错过了什么吗?是否因为条件渲染在内部<ui:repeat>而没有评估when?

任何帮助将非常感谢.提前致谢

Min*_*win 12

你需要删除c:choose,因为正如@Jens在评论中所说的那样,它们会在不同的阶段进行处理.您可以将JSTL与JSF结合使用,但必须遵守它们的解决顺序.阅读BalusC的精美答案,他摇滚.

根据您的需要,您可以使用呈现的属性来有条件地输出文本:

<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>
Run Code Online (Sandbox Code Playgroud)


sku*_*sel 10

只是为了添加Mindwin的答案,您需要了解这<c:choose>是一个标记处理程序,何时<ui:repeat>是UI组件.前者在构建组件树时进行评​​估,后者在视图被渲染时进行评估,即在以后进行.鉴于此,在depenence var<ui:repeat>是什么,是你的代码错误,因为这时候还未进行<c:choose>进场.

这里有两件事需要记住.

使用迭代标记处理程序<c:forEach>,包含您的内容:

<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>
Run Code Online (Sandbox Code Playgroud)

使用这种方法,两个标签同时运行(正在构建视图),因此不会发生冲突.请记住,如果您的bean是视图作用域,它将在每次请求时重新创建.

使用带有rendered属性的UI组件:

<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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,一切都在同一时间运行(正在呈现视图).请注意,您可以使用属性渲染一大堆HTML,例如,<ui:fragment>以及某些某些JSF标记.<h:outputText>rendered


最后,继续使用经典帖子:JSF2 Facelets中的JSTL ......有意义吗?,以全面了解标记处理程序和UI组件之间的关系.