Como comparar duas variáveis ??de objeto em EL linguagem de expressão?
-
19-09-2019 - |
Pergunta
Estou criando uma lista suspensa de todas as línguas para baixo. A seleção do idioma padrão para a lista será determinado por informações adicionadas pelo usuário:
<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
não parece existir em EL. Tendo tido um olhar aqui é sugerido que eu escrever a minha própria função e, em seguida, importar e usar isso. Como este é um fora de uma coisa pequena apenas para esta página Eu não quero ter que começar a criar bibliotecas etc apenas para isso. Nem quero para começar a criar objetos especializados para o servlet de retorno com esta informação adicional neles.
A única coisa que eu posso pensar em fazer é devolver o HTML real para toda a linha de opção a partir do servlet em vez de apenas a string língua, mas que me parece feio por isso estou esperando há uma solução mais elegante.
O que é o melhor plano para uma solução rápida para comparar duas cadeias em EL?
Solução
Na Expression Language você pode apenas usar o ==
ou operador eq
para comparar os valores de objectos. Nos bastidores eles vão realmente usar o Object#equals()
. Desta forma, está feito, porque até com a actual versão EL 2.1 você não pode chamar métodos com outras assinaturas do que os métodos getter padrão (e setter) (na próxima EL 2.2 seria possível).
Assim, a linha especial
<c:when test="${lang}.equals(${pageLang})">
deve ser escrita como (note que toda a expressão está dentro do {
e }
)
<c:when test="${lang == pageLang}">
ou, equivalentemente
<c:when test="${lang eq pageLang}">
Ambos estão nos bastidores aproximadamente interpretadas como
jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang"))
Se você quiser comparar valores String
constantes, então você precisa para citá-lo
<c:when test="${lang == 'en'}">
ou, equivalentemente
<c:when test="${lang eq 'en'}">
que está por trás das cenas mais ou menos interpretados como
jspContext.findAttribute("lang").equals("en")
Outras dicas
Não tenho certeza se eu te direito, mas a maneira mais simples seria algo como:
<c:if test="${languageBean.locale == 'en'">
<f:selectItems value="#{customerBean.selectableCommands_limited_en}" />
</c:if>
Apenas uma cópia rápida e colar a partir de um aplicativo de meus ...
HTH