2010-01-19 58 views
3

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> 

回答

7

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中仍然非常有价值。你可以继续使用它。

+0

我对我的代码xmlns进行了以下更改:c =“http://java.sun.com/jsp/jstl/core 所有调试语句(h:outputText)都为我输出空值。当然,如果所有的fn:函数在我这里都能正常工作,我还有什么不足呢? – Achaius 2010-01-19 13:02:33

+0

阅读http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets。至于BalusC如上所述,删除c:forEach和c:if,它们在构建视图时进行评估,而不是在将值应用于页面时进行评估。 – mtpettyp 2010-01-20 14:50:56