4

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

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

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

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

它会像 javaswitch语句一样case工作break- 如果第一个是真的,第二个不会被测试,对吧?

我应该写什么来获得“switchcase但没有break”的声明:

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

4

2 回答 2

10

因此,您基本上是在寻找一个直通开关。这是不可能的,<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>
...
于 2013-11-09T17:10:35.730 回答
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>
于 2013-11-09T16:15:15.237 回答