如果我的jsf页面上有以下代码:
<c:choose>
<c:when test="${empty example1}">
</c:when>
<c:when test="${empty example2}">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
它会像带有
switch
和case
的java break
语句一样工作-如果第一个条件为true,第二个将不被测试,对吗?我应该怎么写才能获得“带有
switch
但没有case
的break
语句”:当第一个
C:when
为true时,某些内容将添加到页面中;第二个为true时,某些内容也将添加到页面中 最佳答案
因此,您基本上是在寻找一种直通式开关。对于<c:choose>
,这是不可能的,因为它代表了真实的if-else...
。 JSTL不提供任何用于直通交换机的标签。
最好的选择是使用多个<c:if>
,其中还将前面的条件检查为or
条件。
<c:if test="#{empty example1}">
...
</c:if>
<c:if test="#{empty example1 or empty example2}">
...
</c:if>
<c:if test="#{empty example1 or empty example2 or empty example3}">
...
</c:if>
...
使用JSF时,另一种方法是使用组件的
rendered
属性。<h:panelGroup rendered="#{empty example1}">
...
</h:panelGroup>
<h:panelGroup rendered="#{empty example1 or empty example2}">
...
</h:panelGroup>
<h:panelGroup rendered="#{empty example1 or empty example2 or empty example3}">
...
</h:panelGroup>
...
区别在于它是在视图渲染时而不是在视图构建时评估的。因此,例如,如果您基于当前迭代的行在
<h:dataTable>
中使用此函数,则<c:if>
可能不会达到您期望的方式。另见JSTL in JSF2 Facelets... makes sense?要消除条件检查样板,可以使用
<c:set>
创建新的EL变量。这在两种方法中均有效。<c:set var="show1" value="#{empty example1}" />
<c:set var="show2" value="#{show1 or empty example2}" />
<c:set var="show3" value="#{show2 or empty example3}" />
<h:panelGroup rendered="#{show1}">
...
</h:panelGroup>
<h:panelGroup rendered="#{show2}">
...
</h:panelGroup>
<h:panelGroup rendered="#{show3}">
...
</h:panelGroup>
...