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?

O J2EE 1.4 Tutorial

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top