2009-12-14 11 views
39

Sto creando un elenco a discesa di tutte le lingue. La selezione della lingua predefinita per la lista sarà determinato da informazioni aggiunte dall'utente:Come confrontare due variabili oggetto nel linguaggio di espressione EL?

<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 non sembra esistere in EL. Avendo dato un'occhiata qui suggerisco di scrivere la mia funzione e poi importarla e usarla. Dato che questa è una piccola cosa solo per questa pagina, non voglio dover iniziare a creare librerie ecc solo per questo. Né voglio iniziare a creare oggetti specializzati per il servlet da restituire con queste informazioni extra in loro.

L'unica cosa che mi viene in mente di fare è quello di restituire il codice HTML effettivo per l'intera linea di opzione dal servlet piuttosto che solo la stringa di lingua, ma che mi sembra brutto quindi spero ci sia una soluzione più elegante.

Qual è il piano migliore per una soluzione rapida per il confronto di due stringhe in EL?

The J2EE 1.4 Tutorial

risposta

99

In Expression Language è possibile utilizzare l'operatore == o eq per confrontare i valori dell'oggetto. Dietro le quinte usano effettivamente lo Object#equals(). In questo modo, perché fino alla versione corrente di EL 2.1 non è possibile richiamare metodi con altre firme rispetto ai metodi getter (e setter) standard (nel prossimo EL 2.2 sarebbe possibile).

Così la linea di particolare

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

dovrebbe essere scritto come (si noti che l'intera espressione si trova all'interno del { e })

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

o, equivalentemente

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

Entrambi sono dietro le quinte approssimativamente interpretati a s

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

Se si desidera confrontare costanti String valori, allora avete bisogno di citarlo

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

o, equivalentemente

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

che si trova dietro le quinte o meno interpretati come

jspContext.findAttribute("lang").equals("en") 
+1

Suppongo di poter usare anche 'test =" $ {lang eq 'en'} "? Vedo 'eq' lassù, ma non con le costanti stringa? Basta fare in modo, non lo faccio spesso io con JSTL lingua/espressione spesso – SuckerForMayhem

+1

@Sucker: 'eq' è un alias per' == '. Fanno esattamente la stessa cosa. Vedi anche [operatori in EL] (http://docs.oracle.com/javaee/6/tutorial/doc/bnaik.html). – BalusC

+0

Funziona ECCETTO in un caso di comparazione delle stringhe di 1 lettera. Poi si dovrebbe usare (swap semplice per i doppi apici) http://struts.apache.org/release/2.0.x/docs/why-wont -la-se-tag-valutare-a-uno-char-string.html – exoddus

2

Non sono sicuro se ti prendo a destra, ma il modo più semplice sarebbe qualcosa di simile:

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

solo una copia rapida e incolla da un'applicazione di mine ...

HTH

+0

Ehi, Penso che stai confrontando una stringa con una stringa 'costante' qui? languageBean.locale == 'en'? Mentre sto confrontando due variabili, quindi '==' non funzionerà in quanto ciò confronterà i puntatori. Grazie, CJ –

+0

hai ragione. era un po 'un'istantanea, sry. – KB22

+0

ma in realtà, parzialmente corretto, come BalusC spiega che il '==' è l'operatore corretto dopotutto e posso usarlo! –

Problemi correlati