c:选择多个c:when - fall-through开关

时间:2013-11-09 15:33:14

标签: jsf loops jstl break

如果我在我的jsf页面上有这个代码:

<c:choose>
    <c:when test="${empty example1}">
    </c:when>

    <c:when test="${empty example2}">
    </c:when>

    <c:otherwise>
    </c:otherwise>     
</c:choose>

它将像switchcase的java break语句一样工作 - 如果第一个为真,第二个不会被测试,对吧?

我应该写什么来获得switch语句case但没有break“:

当第一个C:when为真时,某些内容会添加到页面中,当第二个为真时,某些内容也会添加到页面中

2 个答案:

答案 0 :(得分:9)

因此,您基本上正在寻找一种直通开关。 <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>
...

答案 1 :(得分:2)

我认为c:when是不可能的。您可以改为使用c:if

<c:if test="${empty example1}">
      "example1 empty"
</c:if>

<c:if test="${empty example2}">
     "example2 empty"
</c:if>

<c:if test="${not empty example1 and not empty example2}">
     "both not empty"
</c:if>