有条件检查c:如果总是失败
问题描述:
c:if如果测试总是失败,并且它永远不会进入循环。我使用下面的命名空间有条件检查c:如果总是失败
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:c="http://java.sun.com/jstl/core"
字符串(“数组”)被分割为“汤姆和杰里是GAP1朋友”
<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"
这就是说,与JSTL混合JSF是从来就不是一个好主意。它并不总是像预期的那样给出结果,因为它们不会像编码期望的那样同步运行。更重要的是,JSP/JSTL首先从上到下运行,然后将生成的结果交给JSF再次从上到下处理。这会导致一些特定的结构失败。更好地使用纯JSF组件/属性。
相反的c:forEach
,而使用Seam的a4j:repeat
或Facelets的和ui:repeat
代替c:if
使用全有被触发的JSF组件的rendered
属性的显示/隐藏。代替所有JSTL c:set
,在托管bean构造函数或操作方法或getter中编写适当的代码逻辑。
然而JSTL函数(fn
)taglib在JSF中仍然非常有价值。你可以继续使用它。
我对我的代码xmlns进行了以下更改:c =“http://java.sun.com/jsp/jstl/core 所有调试语句(h:outputText)都为我输出空值。当然,如果所有的fn:函数在我这里都能正常工作,我还有什么不足呢? – Achaius 2010-01-19 13:02:33
阅读http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets。至于BalusC如上所述,删除c:forEach和c:if,它们在构建视图时进行评估,而不是在将值应用于页面时进行评估。 – mtpettyp 2010-01-20 14:50:56