Faire JSF accès à une Map<String, ?> les valeurs à partir d'un EL au lieu d'un bean champs?
Est-il une bonne façon de remplacer la manière JSF accède aux haricots champs à partir d'un Langage d'Expression? L'idée est de reproduire ce comportement dans le but d'accéder à un Map<String, ?>
valeurs, où le bean domaines de la map.
En d'autres termes, est-il possible de toute façon à utiliser #{beanContainingNestedMap.keyOfSaidNestedMap}
, comme si keyOfSaidNestedMap
ont été un champ de beanContainingNestedMap
?
Si non, quelle autre solution peut-être que j'ai?
Exemple:
Holder.java
public class Holder {
private Map<String, Object> objects = new HashMap<String, Object>();
public void add(String key, Object value) {
objects.put(key, value);
}
public Object getObject(String key) {
return objects.get(key);
}
}
ExampleBean.java
public class ExampleBean {
private Holder holder = new Holder();
public ExampleBean() {
holder.add("foo", 42);
holder.add("bar", 'X');
}
public Holder getHolder() {
return holder;
}
}
exemple.xhtml
<c:out value="#{exampleBean.holder.foo}" /> <!-- should print "42" -->
<c:out value="#{exampleBean.holder.bar}" /> <!-- should print "X" -->
Ce qui serait formidable si je pouvais faire quelque chose comme (sorte de pseudo-code car je ne sais pas si une telle méthode existe ;)
):
@Override //override JSF's (if any...)
public Object resolveEl(String el) {
try {
super.resolveEl(el);
} catch (ElException e) {
Object bean = e.getBean();
String fieldName = e.getFieldName();
if (bean instanceof Holder) {
Holder holder = (Holder) bean;
Object value = holder.getObject(fieldName);
if (value == null) {
throw e;
} else {
return value;
}
}
}
}
- Ce problème n'est pas sur le JSF, mais EL. Il y a une carte d'accès dans la section de StackOverflow EL wiki. Pour citer deux exemples:
${someMap[dynamicKey]}
,${some['class'].simpleName}
- Merci pour les conseils, mais l'idée était d'abord de savoir si il est possible en tout cas de l'utilisation
#{beanContainingAMap.keyOfTheSaidMap}
au lieu de cela, comme sikeyOfTheSaidMap
ont été un champ de haricots. - Si vous vérifier le lien dans mon commentaire, vous verrez que c'est pas possible. Vous devez utiliser
#{exampleBean.holder[foo]}
. - Il doit être techniquement réalisable de toute façon, je me trompe? Je vais attendre un peu de voir d'autres réponses possibles. Mais n'hésitez pas à ajouter vos propres, car si vous avez la réponse, je vais volontiers accepter
;)
- Votre question est source de confusion. EL prend déjà en charge les cartes sur la boîte, en utilisant exactement la même syntaxe que les javabeans.
- Veuillez jeter un oeil à mon deuxième commentaire pour obtenir plus de précisions.
- Je ne suis pas sûr de savoir pourquoi vous voulez le faire le plus difficile façon, si un moyen simple existe déjà.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser directement la carte par EL.
Holder.java
EL
<c:set var="key" value="#{your dynamic value}" />
Ce problème n'est pas sur le JSF, mais EL. Comme indiqué dans @BalusC commentaire, vous pouvez utiliser directement la notation déjà vous voulez/besoin avec
Map
objets. Je vous ai préparé un exemple de base sur ceci (note: ceci est juste un exemple et doit rester comme il est amélioré depuis qu'il utilise les scriptlets et nous devons éviter les scriptlets utilisation mais pour un rapide sale de test):Utilisateur code de la classe (réduites à des fins de test):
Cela génère une page JSP qui imprime:
Noter que cette (sauf le scriptlet partie) vont travailler sur un Facelets page, car c'est EL et pas JSF.