因此,您基本上是在寻找一个直通开关。这是不可能的,<c:choose>
因为它代表一个 true 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>
基于当前迭代行的 a 中使用 this,则<c:if>
不会按照您期望的方式工作。另请参阅JSF2 Facelets 中的 JSTL... 有意义吗?
要消除条件检查样板,您可以使用<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>
...