我有三个值,我想要在前两个值的情况下渲染一个组件,而另一个组件用于第三个值
下面,我有我的页面:
<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?
任何帮助都将非常感激。提前致谢
答案 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组件之间的关系。