Question

J'ai un Enum appelé Status 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 souhaite accéder à la valeur de VALID à partir d'une balise JSTL. Spécifiquement l'attribut test de la balise <c:when>. Ex.

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

Je ne sais pas si cela est possible.

Était-ce utile?

La solution

Une simple comparaison avec les chaînes de caractères:

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

Autres conseils

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>

Vous avez 3 choix ici, dont aucun n'est parfait:

  1. Vous pouvez utiliser un scriptlet dans l'attribut test:

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

    Ceci utilise l'énumération, mais également un scriptlet, qui n'est pas la & "bonne manière &"; dans JSP 2.0. Mais surtout, cela ne fonctionne pas lorsque vous souhaitez ajouter une autre condition à la même when en utilisant ${}. Et cela signifie que toutes les variables que vous souhaitez tester doivent être déclarées dans un scriptlet, ou conservées dans une requête ou une session (la variable pageContext n'est pas disponible dans les .tag fichiers).

  2. Vous pouvez comparer la chaîne:

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

    Cela semble propre, mais vous introduisez une chaîne qui duplique la valeur enum et ne peut pas être validée par le compilateur. Donc, si vous supprimez ou renommez cette valeur de l'énumération, vous ne verrez plus que cette partie du code n'est plus accessible. Vous devez fondamentalement faire une recherche / remplacement par le code à chaque fois.

  3. Vous pouvez ajouter chacune des valeurs enum que vous utilisez dans le contexte de la page:

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

    et ensuite vous pouvez le faire:

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

Je préfère la dernière option (3), même si elle utilise également un scriptlet. En effet, il ne l'utilise que lorsque vous définissez la valeur. Plus tard, vous pourrez l'utiliser dans des expressions EL plus complexes, avec d'autres conditions EL. Dans l'option (1), vous ne pouvez pas utiliser de scriptlet ni d'expression EL dans l'attribut <=> d'une seule et même balise <=>.

Donc, pour que mon problème soit complètement résolu, je devais procéder comme suit:

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

Ensuite, j'ai pu 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 ). Si vous faites une faute de frappe, vous ne recevrez aucun avertissement avant l'exécution.

Ce serait ma méthode préférée une fois qu'il aura reçu le support IDE approprié.

Méthodes d'assistance

Vous pouvez simplement ajouter des accesseurs à votre enum.

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 supporté par tous les IDE et fonctionnera également si vous ne pouvez pas utiliser EL 3.0 pour le moment. C’est ce que je fais pour le moment, car cela conserve toute la logique dans mon enum.

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

<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 le JSP car vous devez le faire sur chaque page où vous devez utiliser l'énum. Cependant, avec cette solution, il vous suffit de déclarer le getter une fois.

À cette fin, je procède comme suit:

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

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

C'est moche, mais ça marche!

Je n'ai pas de réponse à la question de Kornel, mais j'ai une remarque à propos des autres exemples de script. La plupart des expressions font confiance implicitement à toString(), mais Enum.valueOf() attend une valeur provenant de / qui correspond à la propriété Enum.name(). Donc, on devrait utiliser par exemple:

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

Ajouter une méthode à l'énumération 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>

Lorsque j'utilise un framework MVC, je place les éléments suivants dans mon contrôleur.

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

Cela me permet d'utiliser les éléments suivants dans ma page JSP.

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

Il peut également être utilisé dans votre comparaison

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

Ce que je préfère par rapport à l'ajout d'un littéral de chaîne.

<%@ 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()}
  • Placez l'importation dans le début , dans l'en-tête de page JSP
  • .
  • Si vous souhaitez utiliser la méthode getStatus , utilisez n ° 1
  • .
  • Si vous souhaitez utiliser l'élément enum , utilisez n ° 2 ou n ° 3
  • .
  • Vous pouvez utiliser == au lieu de eq
  • .

Je considère généralement comme une mauvaise pratique de mélanger du code Java dans des fichiers jsps / tag. Utiliser 'eq' devrait faire l'affaire:

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

Je le fais de cette façon lorsqu'il y a beaucoup de points à utiliser ...

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

Alors maintenant, POJO et enum obj sont créés. Maintenant, EnumTest vous allez définir un objet de session à l'aide de la classe de servlet ou de contrôleur. session.setAttribute (" enumTest " ;, EnumTest);

Dans la page JSP

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

//TRUE??? THEN PROCESS SOME LOGIC
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top