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 si keyOfTheSaidMap 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à.

InformationsquelleAutor sp00m | 2013-07-26