c:if 测试对我来说总是失败,而且它永远不会进入循环。我正在使用以下命名空间
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:c="http://java.sun.com/jstl/core"
要拆分的字符串('array')是“Tom and Jerry are GAP1 friends”
<s:decorate template="/layout/display-text.xhtml">
<c:set var="array" value="#{_mybean.value}"/>
<c:set var="space" value="#{fn:split(array, ' ')}"/>
<c:set var="len" value="#{fn:length(space)}"/>
<h:outputText value="total length = #{len}"/><br/>
<c:forEach begin="0" end="5" var="index">
<h:outputText value="index = #{index}, value = #{space[index]}"/><br/>
<c:set var="val" value="#{space[index]}"/>
<c:if test="#{fn:startsWith(val, 'GAP')}">
<h:outputText value="Found keyword parameter GAP" /><br/>
</c:if>
</c:forEach>
</s:decorate>
最佳答案
JSTL 核心 URI 无效。根据 JSTL TLD它应该是(注意额外的 /jsp
):
xmlns:c="http://java.sun.com/jsp/jstl/core"
也就是说,将 JSF 与 JSTL 混合从来都不是一个好主意。它不会总是像您期望的那样给出结果,因为它们不会像您期望的编码那样同步运行。更多的是JSP/JSTL先自上而下运行,然后将产生的结果交给JSF再从上到下进一步处理。这会导致某些特定的构造失败。最好改用纯 JSF 组件/属性。
而不是 c:forEach
,而是使用 Seam 的 a4j:repeat
或 Facelets 的 ui:repeat
而不是 c: if
使用必须切换为显示/隐藏的 JSF 组件的 rendered
属性。代替所有 JSTL c:set
,在托管 bean 构造函数或操作方法或 getter 中编写适当的代码逻辑。
然而,JSTL 函数 (fn
) 标签库在 JSF 中仍然非常有值(value)。您可以继续使用它。
关于java - 条件检查 c :if always fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093389/