我只是想证明为什么我们不应该向同事使用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
答案 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?