Verwendung der Option if-else in JSTL


Antworten:


520

Ja, aber es ist höllisch klobig, z

<c:choose>
  <c:when test="${condition1}">
    ...
  </c:when>
  <c:when test="${condition2}">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>

5
Abgesehen vom Wrapper-Tag (wählen) sehe ich nicht, wie ausführlich dies ist, als wenn / elseif / else wäre. Ein Wrapper-Tag ist kaum "klobig wie die Hölle", oder?
Steven Benitez

19
@Steven: Es ist die XML-Natur davon. Das Boilerplate enthält mehr Zeichen als die eigentliche Logik.
Skaffman

2
Ah, ok. Das gleiche könnte auch dann eingestellt <c:if/>werden.
Steven Benitez

15
Ich weiß, dass ich ein bisschen zu spät zur Party komme, aber es <c:otherwise>scheint ein bisschen wortreich zu sein, oder?
Andronikus

6
Beginnen Sie mit der Verschachtelungslogik mit angemessener Einrückung und klobig wie die Hölle wird eine zu freundliche Beschreibung sein.
Adam Tolley

105

Zusätzlich mit Skaffman Antwort, einfach wenn-sonst können Sie ternären Operator wie diesen verwenden

<c:set value="34" var="num"/>
<c:out value="${num % 2 eq 0 ? 'even': 'odd'}"/>

6
Dies ist eine gute Antwort, aber sehr situativ, wie nützlich es wäre.
Mike LP

47

Es gibt kein Wenn-Sonst, nur wenn.

<c:if test="${user.age ge 40}">
 You are over the hill.
</c:if>

Optional können Sie wählen, wann:

<c:choose>
  <c:when test="${a boolean expr}">
    do something
  </c:when>
  <c:when test="${another boolean expr}">
    do something else
  </c:when>
  <c:otherwise>
    do this when nothing else is true
  </c:otherwise>
</c:choose>

Hallo @iwxfer, Ihr obiger Link ist momentan nicht verfügbar. Bitte aktualisieren Sie ihn, wenn Sie so gut wie möglich punkten können. Andernfalls entfernen Sie ihn.
Ajay2707

25

Ich bin damit durchgekommen, einfach zwei if-Tags zu verwenden, und dachte, ich würde eine Antwort hinzufügen, falls sie für andere von Nutzen ist:

<c:if test="${condition}">
  ...
</c:if>
<c:if test="${!condition}">
  ...
</c:if>

Obwohl dies technisch gesehen an sich kein if-elseProblem ist, ist das Verhalten dasselbe und vermeidet den umständlichen Ansatz bei der Verwendung des chooseTags. Je nachdem, wie komplex Ihre Anforderung ist, ist dies möglicherweise vorzuziehen.


1
Betrachten Sie den Fall, in dem die Bedingung etwas Kompliziertes und Hässliches ist, wie $ {not param.age gt 42 und someOtherVar eq 'foobar'}. Sie müssten die Bedingung in einer temporären booleschen Variablen speichern, damit Sie! Condition ausführen oder die Umkehrung dieser Bedingung schreiben können. Beides hässlich. Die "sonst" -Syntax ist eine garantierte Umkehrung.
Matt brennt

3
In der Tat würde eine komplexe Bedingung entweder eine lokale Variable oder das Schreiben der Umkehrung erfordern, aber beide Optionen würden immer noch funktionieren. Ich habe klargestellt, dass es davon abhängen würde, wie komplex die Anforderung ist, ob dieser Ansatz dem chooseTag vorzuziehen wäre .
Jonk

2
Ich stimme dem zu. Wenn Sie nur eine andere haben, ist es weniger markeup als mit c: select
javaMoca

1
Es gibt einen weiteren zusätzlichen Vorteil von <c: if test = "$ {condition} == true"> und <c: if test = "$ {condition == false}">. Wenn die Variable null ist (nicht initialisiert), wird keine Verzweigung ausgeführt, was gut ist. Wenn Sie mit <c: select> und <c: when> arbeiten, wird der falsche Zweig ausgeführt, wenn die Variable null ist.
Steve Stilson

3

Sie müssen diesen Code verwenden:

mit <%@ taglib prefix="c" uri="http://www.springframework.org/tags/form"%>

und

<c:select>
            <option value="RCV"
                ${records[0].getDirection() == 'RCV' ? 'selected="true"' : ''}>
                <spring:message code="dropdown.Incoming" text="dropdown.Incoming" />
            </option>
            <option value="SND"
                ${records[0].getDirection() == 'SND'? 'selected="true"' : ''}>
                <spring:message code="dropdown.Outgoing" text="dropdown.Outgoing" />
            </option>
        </c:select>

-1

Dies ist ein guter und effizienter Ansatz für die zeitliche Komplexität. Sobald es einen wahren Zustand erreicht hat, wird es danach keine weiteren prüfen. In mehreren If wird jedes und jede Bedingung überprüft.

   <c:choose>
      <c:when test="${condtion1}">
        do something condtion1
      </c:when>
      <c:when test="${condtion2}">
        do something condtion2
      </c:when>
      ......
      ......
      ...... 
      .......

      <c:when test="${condtionN}">
        do something condtionn N
      </c:when>


      <c:otherwise>
        do this w
      </c:otherwise>
    </c:choose>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.