4

私のjsfページにこのコードがある場合:

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

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

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

andを使用したJavaswitchステートメントのように機能します。casebreak

" with but without "switchステートメントを取得するには、何を書く必要がありますか:casebreak

最初C:whenが true の場合は何かがページに追加され、2 番目が true の場合は何かがページにも追加されます

4

2 に答える 2

10

したがって、基本的にフォールスルースイッチを探しています。<c:choose>true を表すため、これは不可能です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>ていた場合、期待どおりに機能しませんでした。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 に答える