2009-12-14 15 views
39

Estoy creando una lista desplegable de todos los idiomas. La selección del idioma por defecto de la lista será determinado por la información añadida por el usuario:¿Cómo comparar dos variables de objeto en el lenguaje de expresión 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 no parece existir en EL. Después de echar un vistazo aquí, se sugiere que escriba mi propia función y luego la importe y la use. Como esta es una pequeña cosa solo para esta página, no quiero tener que empezar a crear bibliotecas, etc. solo para esto. Tampoco quiero comenzar a crear objetos especializados para que el servlet regrese con esta información adicional.

Lo único que puedo hacer es devolver el html real para toda la línea de opciones del servlet en lugar de solo la cadena de idioma, pero eso me parece feo, así que espero que haya una solución más elegante.

¿Cuál es el mejor plan para una solución rápida para comparar dos cadenas en EL?

The J2EE 1.4 Tutorial

Respuesta

99

En Expression Language puede simplemente usar el operador == o eq para comparar valores de objeto. Detrás de escena, usarán el Object#equals(). De esta manera se hace así, porque hasta que con la versión EL 2.1 actual no pueda invocar métodos con otras firmas que los métodos getter (y setter) estándar (en el próximo EL 2.2 sería posible).

Así que la línea particular

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

debe escribirse como (tenga en cuenta que toda la expresión es en el interior del { y })

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

o, equivalentemente

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

Tanto están detrás de la escena interpretaron aproximadamente una s

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

Si desea comparar constantes String valores, entonces usted necesita para citarlo

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

o, equivalentemente

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

que está detrás de las escenas más o menos interpretadas como

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

Supongo que puedo usar 'test =" $ {lang eq 'en'} "¿entonces también? Veo 'eq' allá arriba, pero no fue con constantes de cadena? Solo me aseguro de no frecuentar el lenguaje JSTL/expression a menudo – SuckerForMayhem

+1

@Sucker: 'eq' es un alias para' == '. Ambos hacen exactamente lo mismo. Ver también [operadores en EL] (http://docs.oracle.com/javaee/6/tutorial/doc/bnaik.html). – BalusC

+0

Funciona EXCEPTO en 1 carta Caso de comparación de cadenas. Entonces debería usar (intercambio simple para comillas dobles) http://struts.apache.org/release/2.0.x/docs/why-wont -the-if-tag-evaluate-a-one-char-string.html – exoddus

2

No estoy seguro si te consigo la derecha, pero la forma más sencilla sería algo así como:

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

Sólo una copia rápida y pegar de una aplicación mío ...

HTH

+0

Hola, Creo que estás comparando una cadena a una cadena 'constante' aquí? languageBean.locale == 'en'? Mientras que estoy comparando dos variables, por lo tanto '==' no funcionará, ya que se compararán los punteros. Gracias, CJ –

+0

tienes razón. fue una instantánea, sry. – KB22

+0

pero en realidad, parcialmente correcto, ya que BalusC explica que '==' es el operador correcto después de todo y ¡puedo usar eso! –

Cuestiones relacionadas