如果我的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语句一样工作-如果第一个条件为true,第二个将不被测试,对吗?

我应该怎么写才能获得“带有switch但没有casebreak语句”:

当第一个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>
...

10-04 13:55