webentwicklung-frage-antwort-db.com.de

Wie vergleiche ich zwei Objektvariablen in der EL-Ausdruckssprache?

Ich erstelle eine Dropdown-Liste aller Sprachen. Die Auswahl der Standardsprache für die Liste wird anhand der vom Benutzer hinzugefügten Informationen festgelegt:

<select>
    <c:forEach items="${languages}" var="lang">
        <c:choose>
            <c:when test="${lang}.equals(${pageLang})">
                <option value="${lang}" selected>${lang}</option>
            </c:when>
            <c:otherwise>
                <option value="${lang}">${lang}</option>
            </c:otherwise>
        </c:choose>
    </c:forEach>
</select>

.equals scheint in EL nicht zu existieren. Nachdem ich hier nachgesehen habe, wird empfohlen, dass ich meine eigene Funktion schreibe und diese dann importiere und benutze. Da dies nur für diese Seite eine einmalige Kleinigkeit ist, möchte ich nicht damit beginnen müssen, Bibliotheken usw. nur dafür zu erstellen. Ich möchte auch keine speziellen Objekte für das Servlet erstellen, die diese zusätzlichen Informationen enthalten.

Ich kann mir nur vorstellen, das tatsächliche HTML für die gesamte Optionszeile vom Servlet und nicht nur die Sprachzeichenfolge zurückzugeben, was mir jedoch hässlich vorkommt, und ich hoffe, dass es eine elegantere Lösung gibt.

Was ist der beste Plan für eine schnelle Lösung zum Vergleichen von zwei Zeichenfolgen in EL?

Das J2EE 1.4 Tutorial

44
Caroline

In Ausdruckssprache können Sie einfach den Operator == Oder eq verwenden, um Objektwerte zu vergleichen. Hinter den Kulissen wird tatsächlich die Funktion Object#equals() verwendet. Dies ist der Fall, da Sie bis zur aktuellen EL 2.1-Version keine Methoden mit anderen Signaturen als die Standard-Getter- (und Setter-) Methoden aufrufen können (in der kommenden EL 2.2 wäre dies möglich).

Also die besondere Linie

<c:when test="${lang}.equals(${pageLang})">

sollte geschrieben werden als (beachten Sie, dass sich der gesamte Ausdruck innerhalb von { und } befindet)

<c:when test="${lang == pageLang}">

oder äquivalent

<c:when test="${lang eq pageLang}">

Beide werden hinter den Kulissen grob interpretiert als

jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang"))

Wenn Sie konstante String Werte vergleichen möchten, müssen Sie diese in Anführungszeichen setzen

<c:when test="${lang == 'en'}">

oder äquivalent

<c:when test="${lang eq 'en'}">

das ist hinter den Kulissen grob interpretiert als

jspContext.findAttribute("lang").equals("en")
103
BalusC

Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber der einfachste Weg wäre so etwas wie:

<c:if test="${languageBean.locale == 'en'">
  <f:selectItems value="#{customerBean.selectableCommands_limited_en}" />
</c:if>

Nur ein kurzes Kopieren und Einfügen aus einer App von mir ...

HTH

3
KB22