c:if标签test布尔值失效咨询:JSF始终走false分支
解决JSF中
<c:if>标签布尔值判断异常的问题 兄弟,你踩了一个JSF新手很容易掉的坑——这本质是JSTL标签和JSF组件的生命周期不匹配导致的!
问题根源
JSTL的<c:if>是在视图构建阶段执行的,而<p:dataTable>里的var变量要等到视图渲染阶段才会被逐个赋值。简单说,当<c:if>开始判断的时候,var还根本没被初始化,#{var.boolean}拿到的其实是null——而EL表达式里#{not null}的结果就是true,所以不管你后续var.boolean是true还是false,<c:if test="#{not var.boolean}">都会一直触发,另一个分支永远没机会执行。
至于你说<h:outputText>能正常显示值,那是因为它是JSF组件,是在渲染阶段才去读取var的值,这时候var已经被正确赋值了,所以没问题。
解决方案
把JSTL的<c:if>换成JSF自带的<ui:fragment>或者<h:panelGroup>,用它们的rendered属性做条件判断——rendered是在视图渲染阶段执行的,和var的生命周期完全匹配,能正确读取到var.boolean的实际值。
修改后的代码示例
<p:dataTable id="table" var="var" value="#{bean.array}"> <p:column headerText="header"> <ui:fragment rendered="#{var.boolean}"> <h:outputText value="#{var.item}" style="color: green" /> <h:outputText value="#{var.item2}" style="color: red" /> </ui:fragment> <ui:fragment rendered="#{not var.boolean}"> <h:outputText value="#{var.item}" style="color: red" /> <h:outputText value="#{var.item2}" style="color: green" /> </ui:fragment> </p:column> </p:dataTable>
如果需要生成一个HTML容器元素(比如<div>),可以用<h:panelGroup>替代:
<p:dataTable id="table" var="var" value="#{bean.array}"> <p:column headerText="header"> <h:panelGroup rendered="#{var.boolean}"> <h:outputText value="#{var.item}" style="color: green" /> <h:outputText value="#{var.item2}" style="color: red" /> </h:panelGroup> <h:panelGroup rendered="#{not var.boolean}"> <h:outputText value="#{var.item}" style="color: red" /> <h:outputText value="#{var.item2}" style="color: green" /> </h:panelGroup> </p:column> </p:dataTable>
关键提醒
记住这个核心规则:在JSF迭代组件(比如dataTable、repeat)内部,绝对不要用JSTL标签做条件判断或循环,它们的执行时机和JSF组件完全错位,只会带来各种莫名其妙的问题。所有条件渲染都应该用JSF组件的rendered属性来实现。
内容的提问来源于stack exchange,提问作者tarita tanta
相关产品推荐
相关产品推荐

