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?
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")
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
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