2009-12-14 8 views
39

Ich erstelle eine Dropdown-Liste aller Sprachen. Die Standardsprache Auswahl für die Liste wird vom Benutzer hinzugefügt Informationen bestimmt werden:Wie zwei Objektvariablen in EL Ausdruck Sprache zu vergleichen?

<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 nicht in EL zu existieren scheint. Nach einem Blick hier ist es vorgeschlagen, dass ich meine eigene Funktion schreibe und dann importiere und benutze. Da dies eine einmalige kleine Sache nur für diese Seite ist, möchte ich nicht erst Bibliotheken dafür erstellen müssen. Ich möchte auch nicht damit beginnen, spezielle Objekte zu erstellen, damit das Servlet mit diesen zusätzlichen Informationen zurückkehren kann.

Ich denke nur, dass ich den tatsächlichen HTML-Code für die ganze Optionszeile aus dem Servlet zurückgeben soll, anstatt nur die Sprachzeichenfolge, aber das erscheint mir hässlich, also hoffe ich, dass es eine elegantere Lösung gibt.

Was ist der beste Plan für eine schnelle Lösung zum Vergleich zweier Strings in EL?

The J2EE 1.4 Tutorial

Antwort

99

In Expression Language können Sie einfach den Operator == oder eq verwenden, um Objektwerte zu vergleichen. Hinter den Kulissen werden sie tatsächlich die Object#equals() verwenden. Dieser Weg ist so, denn bis zur aktuellen EL 2.1-Version können Sie keine Methoden mit anderen Signaturen als Standard-Getter (und Setter) -Methoden aufrufen (in der kommenden EL 2.2 wäre das möglich).

So ist die besondere Linie

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

sollte geschrieben werden (beachten Sie, dass der gesamte Ausdruck in der { und })

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

oder äquivalent

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

Beide Hinter den Kulissen werden grob a s

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

Wenn Sie konstant String Werte vergleichen wollen, dann müssen Sie es

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

oder äquivalent

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

die etwa hinter den Kulissen als

interpretiert ist zu zitieren
jspContext.findAttribute("lang").equals("en") 
+1

Ich gehe davon aus, dass ich 'test =" $ {lang eq 'en'} "dann auch verwenden kann? Ich sehe 'eq' da oben, aber es war nicht mit String-Konstanten? Ich stelle nur sicher, dass ich mich nicht häufig mit JSTL/Ausdruck sprache beginne – SuckerForMayhem

+1

@Sucker: 'eq' ist ein Alias ​​für' == '. Sie machen beide genau gleich. Siehe auch [Operatoren in EL] (http://docs.oracle.com/javaee/6/tutorial/doc/bnaik.html). – BalusC

+0

Es funktioniert AUSSER in 1 Buchstaben String Vergleich. Dann sollten Sie exoddus

2

nicht sicher, ob ich Dich richtig, 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 eine schnelle Kopie und von einer App von mir einfügen ...

HTH

+0

Hey, Ich denke, Sie vergleichen hier eine Zeichenfolge mit einer "konstanten" Zeichenfolge? languageBean.locale == 'en'? Während ich zwei Variablen vergleiche, wird '==' nicht funktionieren, da dies Zeiger vergleicht. Danke, CJ –

+0

Sie haben Recht. war ein bisschen wie ein Schnappschuss, sry. – KB22

+0

aber tatsächlich, teilweise richtig, wie BalusC erklärt, dass das '==' immerhin der richtige Operator ist und ich das nutzen kann! –