Jak porównać dwie zmienne obiektowe w języku wyrażeń el?

Tworzę listę rozwijaną wszystkich języków. Wybór domyślnego języka dla listy zostanie określony na podstawie informacji dodanych przez użytkownika:

<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 wygląda na to, że nie istnieje w EL. Po przyjrzeniu się tutaj sugeruję napisanie własnej funkcji, a następnie zaimportowanie i użycie jej. Ponieważ jest to jednorazowa mała rzecz tylko dla tej strony, nie chcę zaczynać tworzenia bibliotek itp. Nie chcę też tworzyć specjalistycznych obiektów dla servletu do wróć z tymi dodatkowymi informacjami w nich.

Jedyną rzeczą, którą mogę zrobić, to zwrócić rzeczywisty html dla całej linii opcji z servletu, a nie tylko ciąg języka, ale wydaje mi się to brzydkie, więc mam nadzieję, że jest bardziej eleganckie rozwiązanie.

Jaki jest najlepszy plan na szybkie porównanie dwóch ciągów w EL?

J2EE 1.4 Tutorial

Author: BalusC, 2009-12-14

2 answers

W języku wyrażeń możesz po prostu użyć operatora == lub eq do porównania wartości obiektów. Za kulisami będą faktycznie używać Object#equals(). Tak się dzieje, ponieważ dopóki w obecnej wersji EL 2.1 nie można wywoływać metod z innymi podpisami niż standardowe metody getter (i setter) (w nadchodzącym el 2.2 byłoby to możliwe).

Więc konkretna linia

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

Należy zapisać jako (zauważ, że całe wyrażenie znajduje się wewnątrz { i })

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

Lub równoważnie

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

Oba są za kulisami z grubsza interpretowane jako

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

Jeśli chcesz porównać stałe String wartości, musisz ją zacytować

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

Lub równoważnie

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

Który jest za kulisami z grubsza interpretowany jako

jspContext.findAttribute("lang").equals("en")
 101
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 18:46:05

Nie wiem czy dobrze rozumiem, ale najprostszym sposobem byłoby coś w stylu:

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

Wystarczy szybko skopiować i wkleić z mojej aplikacji...

HTH

 3
Author: KB22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-14 13:17:24