Pregunta

Tengo una Enumeración llama 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 tener acceso al valor de VALID a partir de una JSTL etiqueta.Específicamente el test atributo de la <c:when> de la etiqueta.E. g.

<c:when test="${dp.status eq Status.VALID">

No estoy seguro de si esto es posible.

¿Fue útil?

Solución

Una simple comparación contra la cadena de obras:

<c:when test="${someModel.status == 'OLD'}">

Otros consejos

Si el uso de MVC de Spring, en la Primavera de Expresión del Lenguaje (SpEL) puede ser útil:

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>

Usted tiene 3 opciones aquí, ninguno de los cuales es perfecto:

  1. Usted puede utilizar un scriptlet en el test atributo:

    <c:when test="<%= dp.getStatus() == Status.VALID %>">

    Este utiliza la enumeración, sino que también utiliza un scriptlet, que no es la manera "correcta" en JSP 2.0.Pero lo más importante, esto no funciona cuando usted desea agregar otra condición a la misma when el uso de ${}.Y esto significa que todas las variables que desea de la prueba tienen que ser declarados en un scriptlet, o se mantiene en la solicitud, o de la sesión (pageContext variable no está disponible en .tag los archivos).

  2. Usted puede comparar contra la cadena:

    <c:when test="${dp.status == 'VALID'}">

    Esto se ve limpio, pero está introduciendo una cadena que duplica el valor de enumeración y no puede ser validada por el compilador.Así que si usted retire el valor de la enumeración o cambiarle el nombre, usted no va a ver que esta parte del código no es accesible más.Básicamente tienes que hacer un buscar/reemplazar en el código cada vez.

  3. Usted puede agregar cada uno de los valores de enumeración de utilizar en la página de contexto:

    <c:set var="VALID" value="<%=Status.VALID%>"/>

    y entonces usted puede hacer esto:

    <c:when test="${dp.status == VALID}">

Yo prefiero la última opción (3), aunque también utiliza un scriptlet.Esto es debido a que sólo se utiliza cuando el valor.Más tarde se puede utilizar en más complejo que EL de las expresiones, junto con otros EL condiciones.Mientras que en la opción (1) no se puede utilizar un scriptlet y una luz de expresión en el test atributo de una sola when de la etiqueta.

Así que para conseguir mi problema completamente resuelto que necesitaba para hacer lo siguiente:

<% pageContext.setAttribute("old", Status.OLD); %>

Entonces yo era capaz de hacer:

<c:when test="${someModel.status == old}"/>...</c:when>

que funcionó como se esperaba.

Aquí hay dos posibilidades más:

JSP EL 3.0 Constantes

Mientras que usted está utilizando, al menos, la versión 3.0 de EL, entonces usted puede importar constantes en su página de la siguiente manera:

<%@ page import="org.example.Status" %>
<c:when test="${dp.status eq Status.VALID}">

Sin embargo, algunos IDEs no entiendo todavía (por ejemplo, IntelliJ de modo que usted no obtendrá ningún advertencias si usted comete un error tipográfico, hasta el tiempo de ejecución.

Esta sería mi método preferido, una vez que llega adecuado soporte IDE.

Métodos Auxiliares

Usted puede simplemente añadir los captadores a su enumeración.

public enum Status { 
  VALID("valid"), OLD("old");

  private final String val;

  Status(String val) {
    this.val = val;
  }

  public String getStatus() {
    return val;
  }

  public boolean isValid() {
    return this == VALID;
  }

  public boolean isOld() {
    return this == OLD;
  }
}

Entonces en tu JSP:

<c:when test="${dp.status.valid}">

Este es compatible con todos los IDEs y también funcionará si usted no puede utilizar EL 3.0 todavía.Esto es lo que yo hago en el momento, ya que mantiene toda la lógica envuelto en mi enum.

También hay que tener cuidado si es posible para la variable de almacenamiento de la enumeración de ser null.Tendrás que comprobar para que en primer lugar si el código no es garantía de que el valor no es nulo:

<c:when test="${not empty db.status and dp.status.valid}">

Creo que este método es superior a aquellos en los que se establece un intermediario valor en el JSP, porque tienes que hacer que en cada página donde usted necesita para utilizar la enumeración.Sin embargo, con esta solución sólo es necesario declarar el captador de una vez.

Para ello hago lo siguiente:

<c:set var="abc">
    <%=Status.OLD.getStatus()%>
</c:set>

<c:if test="${someVariable == abc}">
    ....
</c:if>

Es que se ve feo, pero funciona!

No tengo una respuesta a la pregunta de Kornel, pero tengo una observación acerca de los otros ejemplos de secuencias de comandos.La mayoría de la expresión de la confianza implícita en la toString(), pero el Enum.valueOf() espera un valor que viene de/los partidos de la Enum.name() de la propiedad.Así que uno debe usar por ejemplo:

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %>
...
<c:when test="${someModel.status == Status_OLD}"/>...</c:when>

Añadir un método a la enumeración como:

public String getString() {
    return this.name();
}

Por ejemplo

public enum MyEnum {
    VALUE_1,
    VALUE_2;
    public String getString() {
        return this.name();
    }
}

A continuación, puede utilizar:

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if>

Cuando se utiliza un marco de MVC pongo el siguiente en mi controlador.

request.setAttribute(RequestParameterNamesEnum.INBOX_ACTION.name(), RequestParameterNamesEnum.INBOX_ACTION.name());

Esto me permite utilizar el siguiente en mi Página JSP.

<script> var url = 'http://www.nowhere.com/?${INBOX_ACTION}=' + someValue;</script>

También puede ser utilizado en la comparación

<c:when test="${someModel.action == INBOX_ACTION}">

Que yo prefiero cargo de poner en un literal de cadena.

<%@ page import="com.example.Status" %>

1. ${dp.status eq Title.VALID.getStatus()}
2. ${dp.status eq Title.VALID}
3. ${dp.status eq Title.VALID.toString()}
  • Poner la importación en el top, en el encabezado de la página JSP
  • Si quieres trabajar con método getStatus, uso #1
  • Si desea trabajar con el enum elemento en sí, el uso de cualquiera de los #2 o #3
  • Puede utilizar == en lugar de eq

En general me considero una mala práctica para la mezcla de código java en las jsp/archivos de etiquetas.El uso de 'eq' debe hacer el truco :

<c:if test="${dp.Status eq 'OLD'}">
  ...
</c:if>

Yo lo hago de esta manera, cuando hay muchos puntos a utilizar...

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

    public static void setRequestAttributes(HttpServletRequest request) {
        Map<String,String> vals = new HashMap<String,String>();
        for (Status val : Status.values()) {
            vals.put(val.name(), val.value);
        }
        request.setAttribute("Status", vals);
    }

}

JSP

<%@ page import="...Status" %>
<% Status.setRequestAttributes(request) %>

<c:when test="${dp.status eq Status.VALID}">
...

En La Clase De Java:

    public class EnumTest{
    //Other property link
    private String name;
    ....

        public enum Status {
                ACTIVE,NEWLINK, BROADCASTED, PENDING, CLICKED, VERIFIED, AWARDED, INACTIVE, EXPIRED, DELETED_BY_ADMIN;
            }

        private Status statusobj ;

    //Getter and Setters
}

Así que ahora POJO y enum obj es creado.Ahora EnumTest usted se encuentra en el objeto de la sesión utilizando en el servlet o clase de controlador período de sesiones.setAttribute("enumTest", EnumTest );

En la Página JSP

<c:if test="${enumTest.statusobj == 'ACTIVE'}">

//TRUE??? THEN PROCESS SOME LOGIC
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top