web-dev-qa-db-fra.com

Comment comparer deux variables objet en langage d'expression EL?

Je crée une liste déroulante de toutes les langues. La sélection de langue par défaut pour la liste sera déterminée par les informations ajoutées par l'utilisateur:

<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 ne semble pas exister dans EL. Après avoir jeté un coup d'œil ici, il est suggéré d'écrire ma propre fonction, puis de l'importer et de l'utiliser. Comme c'est une petite chose unique pour cette page, je ne veux pas avoir à commencer à créer des bibliothèques, etc. juste pour cela. Je ne veux pas non plus commencer à créer des objets spécialisés pour que la servlet revienne avec ces informations supplémentaires.

La seule chose que je peux penser à faire est de renvoyer le code HTML réel pour toute la ligne d'options à partir du servlet plutôt que seulement la chaîne de langue, mais cela me semble laid, j'espère donc qu'il existe une solution plus élégante.

Quel est le meilleur plan pour une solution rapide pour comparer deux chaînes dans EL?

Le tutoriel J2EE 1.4

44
Caroline

Dans Expression Language , vous pouvez simplement utiliser l'opérateur == Ou eq pour comparer les valeurs des objets. Dans les coulisses, ils utiliseront en fait la fonction Object#equals(). De cette façon, car jusqu'à ce que avec la version EL 2.1 actuelle, vous ne puissiez pas invoquer des méthodes avec d'autres signatures que les méthodes getter (et setter) standard (dans la prochaine EL 2.2, ce serait possible).

Donc, la ligne particulière

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

doit être écrit sous la forme (notez que l'expression entière se trouve à l'intérieur des { et })

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

ou équivalent

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

Les deux sont dans les coulisses grossièrement interprétés comme

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

Si vous voulez comparer des valeurs constantes de String, vous devez les citer

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

ou équivalent

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

qui est dans les coulisses grossièrement interprété comme

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

Je ne sais pas si je vous comprends bien, mais le moyen le plus simple serait quelque chose comme:

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

Juste un rapide copier-coller à partir d'une de mes applications ...

HTH

3
KB22