Eu tenho um Enum chamado Status definido como:
public enum Status {
VALID("valid"), OLD("old");
private final String val;
Status(String val) {
this.val = val;
}
public String getStatus() {
return val;
}
}
Eu gostaria de acessar o valor de VALID
de uma tag JSTL. Especificamente, o test
atributo da <c:when>
tag. Por exemplo
<c:when test="${dp.status eq Status.VALID">
Não tenho certeza se isso é possível.
java
jsp
jakarta-ee
jstl
IaCoder
fonte
fonte
Se estiver usando Spring MVC, o Spring Expression Language (SpEL) pode ser útil:
fonte
<c:if>
e<c:when>
(eles falham silenciosamente).Você tem 3 opções aqui, nenhuma das quais é perfeita:
Você pode usar um scriptlet no
test
atributo:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Isso usa o enum, mas também usa um scriptlet, que não é o "jeito certo" no JSP 2.0. Mas o mais importante, isso não funciona quando você deseja adicionar outra condição ao mesmo
when
usando${}
. E isso significa que todas as variáveis que você deseja testar devem ser declaradas em um scriptlet ou mantidas em solicitação ou sessão (apageContext
variável não está disponível nos.tag
arquivos).Você pode comparar com string:
<c:when test="${dp.status == 'VALID'}">
Isso parece limpo, mas você está introduzindo uma string que duplica o valor enum e não pode ser validada pelo compilador. Portanto, se você remover esse valor do enum ou renomeá-lo, não verá que essa parte do código não está mais acessível. Basicamente, você tem que fazer uma busca / substituição por meio do código a cada vez.
Você pode adicionar cada um dos valores enum que usar ao contexto da página:
<c:set var="VALID" value="<%=Status.VALID%>"/>
e então você pode fazer isso:
<c:when test="${dp.status == VALID}">
Prefiro a última opção (3), embora também use um scriptlet. Isso ocorre porque ele só o usa quando você define o valor. Mais tarde, você pode usá-lo em expressões EL mais complexas, junto com outras condições EL. Enquanto estiver na opção (1), você não pode usar um scriptlet e uma expressão EL no
test
atributo de uma únicawhen
tag.fonte
Enum.valueOf(Class<T> enumType, String name)
que irá disparar umELException
se o enum não tiver uma constante com esse nome. A expressão nem sempre será falsa.Portanto, para ter meu problema totalmente resolvido, eu precisava fazer o seguinte:
Então eu fui capaz de fazer:
que funcionou conforme o esperado.
fonte
Aqui estão mais duas possibilidades:
Constantes JSP EL 3.0
Contanto que você esteja usando pelo menos a versão 3.0 do EL, você pode importar constantes para sua página da seguinte maneira:
No entanto, alguns IDEs ainda não entendem isso (por exemplo, IntelliJ ), então você não receberá nenhum aviso se cometer um erro de digitação, até o tempo de execução.
Este seria o meu método preferido, uma vez que obtivesse o suporte IDE adequado.
Métodos auxiliares
Você pode simplesmente adicionar getters ao seu enum.
Então, em seu JSP:
Isso é compatível com todos os IDEs e também funcionará se você ainda não puder usar o EL 3.0. Isso é o que eu faço no momento porque mantém toda a lógica embrulhada em meu enum.
Também tome cuidado se for possível que a variável que armazena o enum seja nula. Você precisaria verificar isso primeiro se o seu código não garantir que não seja nulo:
Acho que esse método é superior àqueles em que você define um valor intermediário no JSP porque você tem que fazer isso em cada página em que precisa usar o enum. No entanto, com esta solução, você só precisa declarar o getter uma vez.
fonte
${MyEnum.}
, coloque um cursor logo após o ponto e pressioneCtrl+Space
para mostrar sugestões.Para este propósito, faço o seguinte:
Parece feio, mas funciona!
fonte
Não tenho uma resposta para a pergunta de Kornel, mas tenho um comentário sobre os outros exemplos de script. A maior parte da expressão confia implicitamente no
toString()
, masEnum.valueOf()
espera um valor que vem / corresponde àEnum.name()
propriedade. Portanto, deve-se usar, por exemplo:fonte
Adicione um método ao enum como:
Por exemplo
Então você pode usar:
fonte
Ao usar um framework MVC, coloco o seguinte no meu controlador.
Isso me permite usar o seguinte em minha página JSP.
Também pode ser usado em sua comparação
O que eu prefiro colocar em um literal de string.
fonte
fonte
Geralmente considero uma má prática misturar código java em arquivos jsps / tag. Usar 'eq' deve resolver o problema:
fonte
==
vez deeq
? Ambos fazem exatamente o mesmo, então não há como um "truque".Eu faço assim quando há muitos pontos para usar ...
JSP
fonte
Na classe Java:
Portanto, agora POJO e enum obj são criados. Agora EnumTest você definirá no objeto de sessão usando na classe de servlet ou controlador session.setAttribute ("enumTest", EnumTest);
Na página JSP
fonte