为什么这些JSTL c:测试不会停止呈现内容?

时间:2012-04-05 06:04:23

标签: java jsf-2 jstl

我只是想证明为什么我们不应该向同事使用JSTL标签,但我不知道为什么每件事都会被渲染。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jstl/core">    
     <h:outputLabel>#{dummyBean.pageBuild}</h:outputLabel>
     <h:outputLabel>#{dummyBean.pageRerendered}</h:outputLabel>     
     <h:outputLabel>#{dummyBean.pageBuild and !dummyBean.pageRerendered}</h:outputLabel>
     <h:outputLabel>#{dummyBean.pageBuild and dummyBean.pageRerendered}</h:outputLabel>
        <c:if test="#{dummyBean.pageBuild and !dummyBean.pageRerendered}">
             <h:outputLabel value="Section 1"></h:outputLabel>
        </c:if>

        <c:if test="#{dummyBean.pageBuild and dummyBean.pageRerendered}">
            <h:outputLabel value="Section 2"></h:outputLabel>
        </c:if>

</ui:composition>

结果

true
false
true
false 
Section 1 
Section 2 

我原以为他们会

true
false
true
false 
Section 1 

1 个答案:

答案 0 :(得分:4)

<c:if test="true">
     <h:outputLabel value="Section 1.1"></h:outputLabel>
</c:if>

<c:if test="false">
    <h:outputLabel value="Section 2.2"></h:outputLabel>
</c:if>

test="true"test="false"将始终评估为布尔值true,因为它是有效且非空的String值。

您可能打算使用test="#{true}"test="#{false}"代替。

<c:if test="#{true}">
     <h:outputLabel value="Section 1.1" />
</c:if>

<c:if test="#{false}">
    <h:outputLabel value="Section 2.2" />
</c:if>

另一个问题是JSTL标记的XML命名空间是错误的,当您使用JSF 2.x时,您正在使用Facelets 1.x.它应该是

xmlns:c="http://java.sun.com/jsp/jstl/core"

关于在JSF中使用JSTL,请查看以下答案:JSTL in JSF2 Facelets... makes sense?