sci*_*iFi 8 jstl primefaces jsf-2
我有三个值,我希望在前两个值的情况下渲染一个组件,为第三个值渲染另一个组件
下面,我有我的页面:
<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组件之间的关系.
归档时间: |
|
查看次数: |
14265 次 |
最近记录: |