instanceof vérifier dans EL langage d'expression
Est-il un moyen pour effectuer une instanceof
vérifier dans EL?
E. g.
<h:link rendered="#{model instanceof ClassA}">
#{errorMessage1}
</h:link>
<h:link rendered="#{model instanceof ClassB}">
#{errorMessage2}
</h:link>
Vous devez vous connecter pour publier un commentaire.
Vous pouvez comparer
Class#getName()
ou, peut-être mieux,Class#getSimpleName()
à unString
.Note l'importance de la spécification
Object#getClass()
avec support de la notation['class']
parce queclass
est réservé Java littérale qui serait autrement jeter un EL exception dans EL 2.2+.Le type de solution de rechange sécuritaire est d'ajouter quelques
public enum Type { A, B }
avecpublic abstract Type getType()
pour la commune de la classe de base du modèle.Toutes les valeurs non valides ici jeter un EL exception lors de l'exécution dans EL 2.2+.
Dans le cas où vous êtes à l'aide de OmniFaces, depuis la version 3.0, vous pourriez utiliser
#{de:isInstance()}
.model['class'].simpleName
peut conduire à des erreurs dans les environnements qui utilisent des proxys (comme JPA). Donc je suis venu avec ma propre solution. Je me demande pourquoi OmniFaces ne comprend pas quelque chose de semblable, par exemple une coutume EL de la fonction.of:isInstance()
.Qui ne fonctionne pas dans
EL
. Utilisation de la sauvegarde de haricot pour cela:Et ensuite faire le vérifier en appelant le backing bean:
cela fonctionne:
Définir une fonction statique comme:
Définir une coutume EL fonction, et de l'utiliser.
On peut également passer un nom de chaîne et de faire un
forName()
à l'intérieur de la méthode.Il y a un moyen, voir
JSF EL: instanceof réservé, mais n'est pas encore implémentée?
Cependant, la
instanceof
opérateur n'est pas encore mis en œuvre, au moins dans Mojarra 2.1. Merci de voter pour le bug ici:http://java.net/jira/browse/JSP_SPEC_PUBLIC-113
La meilleure solution actuellement est probablement pour stocker le nom de la classe dans un backing bean de lecture au lieu de créer un booléen méthode de test pour chaque classe:
Donc, ce serait un mélange de BalusC du flash et de solutions. Il serait toutefois beaucoup plus lisible dans JSF que BalusC de plus il est à peu près semblable à l'avenir
instanceof
opérateur:Ce ne sera pas de produire une méthode par classe de test sur le backing bean en flash suggéré. Cela pourrait être plus lente que flash est bien.
Pas très élégant mélange de JSP EL et le plus tôt la syntaxe de l'expression, mais ne nécessite pas d'extra Java code:
Vous pouvez utiliser un helper bean pour que:
Utilisation:
Ceci a l'avantage que l'héritage est pris en compte et vous pouvez tester pour les classes qui vous ne pouvez pas modifier (à la fois les inconvénients des solutions de BalusC).
Si vous souhaitez utiliser le simple nom de la classe (et n'ont pas peur de collisions de noms), vous pouvez utiliser une recherche de carte que vous pouvez remplir à la main ou avec un chemin de classe scanner comme org.réflexions:
Vous pouvez même déplacer la fonction d'assistance à un ELResolver:
Utilisation: