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 voudrais accéder à la valeur de à VALID
partir d'une balise JSTL. Plus précisément l' test
attribut de la <c:when>
balise. Par exemple
<c:when test="${dp.status eq Status.VALID">
Je ne sais pas si cela est possible.
java
jsp
jakarta-ee
jstl
IaCoder
la source
la source
Si vous utilisez Spring MVC, le langage d'expression Spring (SpEL) peut être utile:
la source
<c:if>
et<c:when>
(ils échouent silencieusement).Vous avez 3 choix ici, dont aucun n'est parfait:
Vous pouvez utiliser un scriptlet dans l'
test
attribut:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Cela utilise l'énumération, mais il utilise également un scriptlet, ce 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
utilisation${}
. Et cela signifie que toutes les variables que vous souhaitez tester doivent être déclarées dans un scriptlet, ou conservées en requête, ou en session (lapageContext
variable n'est pas disponible dans les.tag
fichiers).Vous pouvez comparer avec une chaîne:
<c:when test="${dp.status == 'VALID'}">
Cela semble propre, mais vous introduisez une chaîne qui duplique la valeur d'énumération et ne peut pas être validée par le compilateur. Donc, si vous supprimez cette valeur de l'énumération ou la renommez, vous ne verrez plus que cette partie du code n'est plus accessible. Vous devez essentiellement effectuer une recherche / remplacement dans le code à chaque fois.
Vous pouvez ajouter chacune des valeurs d'énumération que vous utilisez dans le contexte de la page:
<c:set var="VALID" value="<%=Status.VALID%>"/>
et ensuite vous pouvez faire ceci:
<c:when test="${dp.status == VALID}">
Je préfère la dernière option (3), même si elle utilise également un scriptlet. C'est parce qu'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 un scriptlet et une expression EL dans l'
test
attribut d'une seulewhen
balise.la source
Enum.valueOf(Class<T> enumType, String name)
ce qui déclenchera unELException
si l'énumération n'a pas de constante avec ce nom. L'expression ne sera pas toujours toujours fausse.Donc, pour résoudre complètement mon problème, je devais faire ce qui suit:
Ensuite, j'ai pu faire:
qui a fonctionné comme prévu.
la source
Voici deux autres possibilités:
Constantes JSP EL 3.0
Tant que vous utilisez au moins la version 3.0 d'EL, vous pouvez importer des constantes dans votre page comme suit:
Cependant, certains IDE ne comprennent pas encore cela (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 aura un support IDE approprié.
Méthodes d'assistance
Vous pouvez simplement ajouter des getters à votre énumération.
Puis dans votre JSP:
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 pour le moment car cela garde toute la logique dans mon énumération.
Faites également attention s'il est possible que la variable stockant l'énumération soit nulle. Vous devrez d'abord vérifier cela si votre code ne garantit pas qu'il n'est pas nul:
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ération. Cependant, avec cette solution, vous ne devez déclarer le getter qu'une seule fois.
la source
${MyEnum.}
, placez le curseur juste après le point et appuyez surCtrl+Space
pour afficher des suggestions.À cette fin, je fais ce qui suit:
C'est moche, mais ça marche!
la source
Je n'ai pas de réponse à la question de Kornel, mais j'ai une remarque sur les autres exemples de script. La plupart des expressions font implicitement confiance à la
toString()
, maisEnum.valueOf()
attend une valeur qui provient de / correspond à laEnum.name()
propriété. On devrait donc utiliser par exemple:la source
Ajoutez une méthode à l'énumération comme:
Par exemple
Ensuite, vous pouvez utiliser:
la source
Lors de l'utilisation d'un framework MVC, je mets ce qui suit dans mon contrôleur.
Cela me permet d'utiliser ce qui suit dans ma page JSP.
Il peut également être utilisé dans votre comparaison
Ce que je préfère plutôt que de mettre une chaîne littérale.
la source
la source
Je considère généralement que c'est une mauvaise pratique de mélanger du code java dans des fichiers jsps / tag. Utiliser 'eq' devrait faire l'affaire:
la source
==
placeeq
? Ils font tous les deux exactement la même chose, donc il n'y a aucun moyen de "tromper".Je le fais de cette façon quand il y a beaucoup de points à utiliser ...
JSP
la source
Dans la classe Java:
Alors maintenant, POJO et enum obj sont créés. Maintenant EnumTest vous allez définir dans l'objet de session en utilisant dans le servlet ou la classe de contrôleur session.setAttribute ("enumTest", EnumTest);
Dans la page JSP
la source