旧JSF页面条件判断实现咨询:基于列内容输出True/False
验证与优化你的JSF表格判断逻辑
嘿,我仔细看了你写的JSF页面代码,先给你吃个定心丸:你的核心逻辑是可以正常工作的——只要table.col4不为null,它确实能根据是否包含'red box'输出对应的'True'或'False'。不过咱们可以让代码更简洁健壮,下面是具体的分析和优化方案:
原代码的有效性确认
你通过两个<c:if>结合fn:contains函数实现判断的思路是对的,当table.col4存在且包含目标文本时,第一个<c:if>生效输出'True',否则第二个输出'False'。但这里有个潜在问题:如果table.col4是null,fn:contains会抛出NullPointerException,导致页面报错。
优化方案
1. 用EL三目运算符简化代码
代替两个冗余的<c:if>,直接用EL的三目表达式一行搞定,代码更简洁易维护:
<rich:column> <f:facet name="header"> <h:outputText value="Select" /> </f:facet> <h:outputText value="#{fn:contains(table.col4, 'red box') ? 'True' : 'False'}" /> </rich:column>
2. 增加null值防护,避免报错
为了处理table.col4可能为null或空字符串的情况,我们可以先判断是否非空,再执行包含判断:
<rich:column> <f:facet name="header"> <h:outputText value="Select" /> </f:facet> <h:outputText value="#{not empty table.col4 and fn:contains(table.col4, 'red box') ? 'True' : 'False'}" /> </rich:column>
这样即使table.col4是null或者空字符串,也会安全输出'False',不会抛出异常。
3. 可选:忽略大小写的判断(如果需求需要)
如果你的需求允许忽略大小写匹配(比如'Red Box'也需要匹配),可以改用fn:containsIgnoreCase函数:
<h:outputText value="#{not empty table.col4 and fn:containsIgnoreCase(table.col4, 'red box') ? 'True' : 'False'}" />
完整优化后的代码片段
把这些优化点整合后,你的表格列代码会变成这样:
<rich:dataTable id="myTable" value="#{myModel.myTable}" var="table"> <rich:column> <f:facet name="header"> <h:outputText value="Select" /> </f:facet> <h:outputText value="#{not empty table.col4 and fn:contains(table.col4, 'red box') ? 'True' : 'False'}" /> </rich:column> <rich:column> <f:facet name="header"> <h:outputText value="Comments"/> </f:facet> <h:inputTextarea id="col4_1" value="#{table.col4}"/> </rich:column> </rich:dataTable>
这样既保留了你的核心需求,又让代码更简洁、健壮,还能避免潜在的空指针问题~
内容的提问来源于stack exchange,提问作者Quentinb
相关产品推荐
相关产品推荐

