c:选择不在JSF中工作

时间:2013-05-27 08:03:08

标签: jsf-2 primefaces jstl

我有三个值,我想要在前两个值的情况下渲染一个组件,而另一个组件用于第三个值

下面,我有我的页面:

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>

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

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

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

任何帮助都将非常感激。提前致谢

2 个答案:

答案 0 :(得分:11)

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

根据您的需求,您可以使用rendered attribute来有条件地输出文字:

<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>

答案 1 :(得分:10)

只是要添加Mindwin的答案,您需要了解<c:choose>是标记处理程序,而<ui:repeat>是UI组件。在构建组件树时评估前者,而后者 - 在呈现视图时,即在稍后的时间。有鉴于此,对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>

rendered

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

使用带有<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> 属性的UI组件

<ui:fragment>

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


最后,继续使用经典帖子JSTL in JSF2 Facelets… makes sense?,以全面了解标记处理程序和UI组件之间的关系。