Как сравнить две переменные объекта в языке выражений 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>
Просто скопируйте и вставьте из моего приложения...
НТН