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

Jsf c:通过多个c:when-fall-through开关选择,jsf,loops,jstl,break,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> 它将像javaswit

如果我的jsf页面上有以下代码:

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

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

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

它将像java
switch
语句一样使用
case
break
——如果第一个为true,第二个将不会被测试,对吗

我应该写些什么来获取“
switch
语句,其中包含
case
,但不包含
break
”:


当第一个
C:when
为真,第二个为真,页面上也会添加一些内容我认为使用
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>

“示例1为空”
“示例2为空”
“两者都不是空的”

因此,您基本上是在寻找一个直通开关。这在
中是不可能的,因为它代表了一个真正的
if else…
。JSTL不为直通式开关提供任何标记

您最好使用多个
s,其中您还将前面的条件检查为
条件

<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>
...
不同之处在于,它是在视图渲染时计算的,而不是在视图生成时计算的。因此,例如,如果您在基于当前迭代行的
中使用此函数,
将不会以您期望的方式工作。另见

要消除条件检查样板,可以使用
创建新的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>
...

...
...
...
...
<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>
...