Как сравнить две объектные переменные в языке выражений EL? - PullRequest
43 голосов
/ 14 декабря 2009

Я создаю выпадающий список всех языков. Выбор языка по умолчанию для списка будет определяться информацией, добавленной пользователем:

<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 не существует в EL. Посмотрев здесь, я предлагаю написать свою собственную функцию, а затем импортировать и использовать ее. Так как это одна крошечная вещь только для этой страницы, я не хочу начинать создавать библиотеки и т.д. только для этого. Также я не хочу начинать создание специализированных объектов для сервлета, чтобы они возвращались с этой дополнительной информацией.

Единственное, что я могу думать, это вернуть фактический html для всей строки опций из сервлета, а не только строку языка, но это кажется мне уродливым, поэтому я надеюсь, что есть более элегантное решение.

Каков лучший план для быстрого исправления сравнения двух строк в EL?

Руководство по J2EE 1.4

Ответы [ 2 ]

103 голосов
/ 14 декабря 2009

На языке выражений вы можете просто использовать оператор == или eq для сравнения значений объекта. За кулисами они действительно будут использовать Object#equals(). Это делается так, потому что до текущей версии EL 2.1 вы не можете вызывать методы с другими сигнатурами, кроме стандартных методов получения (и установки) (в следующем EL 2.2 это было бы возможно).

То есть конкретная строка

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

должно быть записано как (обратите внимание, что все выражение находится внутри { и })

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

или, что эквивалентно

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

Оба за кадром грубо интерпретируются как

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

Если вы хотите сравнить постоянные String значения, то вам нужно заключить в кавычки

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

или, что эквивалентно

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

, который за кадром грубо интерпретируется как

jspContext.findAttribute("lang").equals("en")
3 голосов
/ 14 декабря 2009

Не уверен, правильно ли я вас понял, но самым простым способом было бы что-то вроде:

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

Просто быстрое копирование и вставка из моего приложения ...

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...