[Java] Accédez à la valeur Enum en utilisant EL avec JSTL


Answers

Si vous utilisez Spring MVC, le langage d'expression Spring (SpEL) peut être utile:

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

J'ai un Enum appelé Statut défini comme tel:

public enum Status { 

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

    private final String val;

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

    public String getStatus() {
        return val;
    }

}

Je voudrais accéder à la valeur de VALID partir d'un tag JSTL. Plus précisément, l'attribut de test de la <c:when> . Par exemple

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

Je ne suis pas sûr que ce soit possible.




Donc, pour que mon problème soit complètement résolu, je devais faire ce qui suit:

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

Ensuite, j'ai été capable de faire:

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

qui a fonctionné comme prévu.




Voici deux autres possibilités:

Constantes JSP EL 3.0

Tant que vous utilisez au moins la version 3.0 de EL, vous pouvez importer des constantes dans votre page comme suit:

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

Cependant, certains IDE ne le comprennent pas encore (par exemple, IntelliJ ) donc vous n'obtiendrez aucun avertissement si vous faites une faute de frappe, jusqu'à l'exécution.

Ce serait ma méthode préférée une fois qu'il obtient un bon support IDE.

Méthodes d'assistance

Vous pourriez simplement ajouter des getters à votre énumération.

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;
  }
}

Puis dans votre JSP:

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

Ceci est pris en charge dans tous les IDE et fonctionnera également si vous ne pouvez pas encore utiliser EL 3.0. C'est ce que je fais en ce moment parce que ça garde toute la logique enveloppée dans mon énumération.

Faites également attention s'il est possible que la variable stockant l'énumération soit nulle. Vous devrez vérifier cela en premier si votre code ne garantit pas qu'il n'est pas nul:

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

Je pense que cette méthode est supérieure à celles où vous définissez une valeur intermédiaire dans la JSP parce que vous devez le faire sur chaque page où vous devez utiliser l'énumération. Cependant, avec cette solution, vous n'avez besoin de déclarer le getter qu'une seule fois.




Ajouter une méthode à l'enum comme:

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

Par exemple

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

Ensuite, vous pouvez utiliser:

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



Je considère généralement que c'est une mauvaise pratique de mélanger le code java dans les fichiers jsps / tag. Utiliser 'eq' devrait faire l'affaire:

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



Links