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

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

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

Учебник J2EE 1.4

Ответ 1

В Язык выражений вы можете просто использовать оператор == или eq для сравнения значений объектов. За кулисами они фактически будут использовать Object#equals(). Таким образом, так как до текущей версии EL 2.1 вы не можете вызывать методы с другими сигнатурами, чем стандартные методы getter (и setter) (в предстоящем 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")

Ответ 2

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

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

Просто скопируйте и вставьте из моего приложения...

НТН