因此,您基本上是在寻找一个贯穿式开关。 <c:choose> 不可能做到这一点,因为它代表了真正的 if-else...。 JSTL 不提供任何用于直通开关的标记。
您最好的选择是使用多个<c:if>s,其中您还将前面的条件检查为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>
...