Tengo un Enum llamado Estado definido como tal:
public enum Status {
VALID("valid"), OLD("old");
private final String val;
Status(String val) {
this.val = val;
}
public String getStatus() {
return val;
}
}
Me gustaría acceder al valor de VALID
desde una etiqueta JSTL. Específicamente el test
atributo de la <c:when>
etiqueta. P.ej
<c:when test="${dp.status eq Status.VALID">
No estoy seguro de si esto es posible.
java
jsp
jakarta-ee
jstl
IaCoder
fuente
fuente
Si usa Spring MVC, Spring Expression Language (SpEL) puede ser útil:
fuente
<c:if>
y<c:when>
(fallan silenciosamente).Tienes 3 opciones aquí, ninguna de las cuales es perfecta:
Puede utilizar un scriptlet en el
test
atributo:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Esto usa la enumeración, pero también usa un scriptlet, que no es la "forma correcta" en JSP 2.0. Pero lo más importante es que esto no funciona cuando desea agregar otra condición al mismo
when
uso${}
. Y esto significa que todas las variables que desea probar deben declararse en un scriptlet, o mantenerse en una solicitud o sesión (lapageContext
variable no está disponible en los.tag
archivos).Puedes comparar con una cadena:
<c:when test="${dp.status == 'VALID'}">
Esto parece limpio, pero está introduciendo una cadena que duplica el valor de enumeración y no puede ser validado por el compilador. Entonces, si elimina ese valor de la enumeración o le cambia el nombre, no verá que esta parte del código ya no es accesible. Básicamente, debe realizar una búsqueda / reemplazo a través del código cada vez.
Puede agregar cada uno de los valores de enumeración que usa en el contexto de la página:
<c:set var="VALID" value="<%=Status.VALID%>"/>
y luego puedes hacer esto:
<c:when test="${dp.status == VALID}">
Prefiero la última opción (3), aunque también usa un scriptlet. Esto se debe a que solo lo usa cuando establece el valor. Más adelante podrá utilizarlo en expresiones EL más complejas, junto con otras condiciones EL. Mientras esté en la opción (1), no puede usar un scriptlet y una expresión EL en el
test
atributo de una solawhen
etiqueta.fuente
Enum.valueOf(Class<T> enumType, String name)
cual activará unaELException
si la enumeración no tiene constante con ese nombre. La expresión no siempre será falsa.Entonces, para resolver mi problema por completo, necesitaba hacer lo siguiente:
Entonces pude hacer:
que funcionó como se esperaba.
fuente
Aquí hay dos posibilidades más:
Constantes JSP EL 3.0
Siempre que esté utilizando al menos la versión 3.0 de EL, puede importar constantes a su página de la siguiente manera:
Sin embargo, algunos IDE aún no comprenden esto (por ejemplo, IntelliJ ), por lo que no recibirá ninguna advertencia si comete un error tipográfico, hasta el tiempo de ejecución.
Este sería mi método preferido una vez que obtenga el soporte IDE adecuado.
Métodos auxiliares
Simplemente podría agregar captadores a su enumeración.
Luego, en tu JSP:
Esto es compatible con todos los IDE y también funcionará si aún no puede usar EL 3.0. Esto es lo que hago en este momento porque mantiene toda la lógica envuelta en mi enumeración.
También tenga cuidado si es posible que la variable que almacena la enumeración sea nula. Debería verificar eso primero si su código no garantiza que no sea nulo:
Creo que este método es superior a aquellos en los que estableces un valor intermedio en la JSP porque tienes que hacerlo en cada página donde necesitas usar la enumeración. Sin embargo, con esta solución, solo necesita declarar el getter una vez.
fuente
${MyEnum.}
, coloque el cursor justo después del punto y presioneCtrl+Space
para mostrar sugerencias.Para ello hago lo siguiente:
Se ve feo, ¡pero funciona!
fuente
No tengo una respuesta a la pregunta de Kornel, pero tengo un comentario sobre los otros ejemplos de secuencias de comandos. La mayor parte de la expresión confía implícitamente en
toString()
, peroEnum.valueOf()
espera un valor que proviene de / coincide con laEnum.name()
propiedad. Entonces uno debería usar, por ejemplo:fuente
Agregue un método a la enumeración como:
Por ejemplo
Entonces puedes usar:
fuente
Cuando uso un marco MVC, pongo lo siguiente en mi controlador.
Esto me permite usar lo siguiente en mi página JSP.
También se puede utilizar en su comparación
Lo que prefiero a poner una cadena literal.
fuente
fuente
En general, considero una mala práctica mezclar código Java en archivos jsps / tag. Usar 'eq' debería hacer el truco:
fuente
==
lugar deeq
? Ambos hacen exactamente lo mismo, por lo que no hay forma de "truco".Lo hago así cuando hay muchos puntos a utilizar ...
JSP
fuente
En clase Java:
Así que ahora se crean POJO y enum obj. Ahora EnumTest lo configurará en el objeto de sesión usando en el servlet o clase de controlador session.setAttribute ("enumTest", EnumTest);
En la página JSP
fuente