2010-02-09 9 views
5

Comment lier dynamiquement une valeur de certains composants lors de l'exécution? Par exemple, j'ai la balise composant suivant,Liaison de valeur dynamique du composant JSF

<h:inputText value="#{bean.someProp}" /> 

Dans mon cas, « # {} bean.someProp » est connu que lors de l'exécution.

Quelle est la meilleure stratégie pour implémenter cela?

Dois-je traverser l'arborescence des composants et définir la liaison de valeur par programme? Si oui, à quelle phase du cycle de vie JSF dois-je faire la traversée?

Répondre

15

Vous pouvez le lier à une propriété de bean Map<String, Object> où la clé String est moins ou plus le nom de la propriété dynamique. Vous pouvez accéder aux valeurs de carte de EL de la manière suivante:

<h:inputText value="#{bean.map.someProp}" /> 

ou

<h:inputText value="#{bean.map['someProp']}" /> 

qui peut même être fait un peu plus dynamique où someVar résout effectivement à une valeur String de "someProp":

<h:inputText value="#{bean.map[someVar]}" /> 

Vous devez seulement vous assurer que le Map est créé lors de l'initialisation du bean, sinon JSF ne peut pas accéder les valeurs de la carte. EL, notamment, ne créera pas de «propriétés imbriquées» pour vous. Ainsi, par exemple instanciation directe:

public class Bean { 
    private Map<String, Object> map = new HashMap<String, Object>(); 
} 

.. ou à l'intérieur d'un constructeur ou @PostConstruct si vous le souhaitez.

+0

Ok, je comprends ce que vous vouliez dire. C'est une bonne idée, sauf que je vais perdre toutes les métadonnées définies dans les annotations de mes entités. Cela signifie également perdre l'avantage d'utiliser (la balise de validation d'hibernation de SEAM) et toutes les autres infrastructures qui dépendent des métadonnées d'annotation. FYI, je fais ceci pour faire un cadre qui implémente le modèle 'objet nu' (l'implémentation d'une ref est http://www.nakedobjects.org/). Fondamentalement, il inspecte une entité et construit automatiquement des tableaux et des formulaires connexes (dans ce cas, l'arborescence des composants). – bungrudi

+0

Urm, ... sur la deuxième pensée, en utilisant cette approche, je ne dois pas perdre toutes ces méta-données d'annotations. Je vais essayer et vous le faire savoir. – bungrudi

+0

C'est comme ça que je le fais actuellement. En faisant cela, je perds l'avantage de et je dois ré-implémenter la validation ailleurs. C'est trivial cependant, il suffit d'appeler hibernateValidator.validate (bean). – bungrudi

0

Une autre option est que vous pouvez ajouter une couche d'abstraction à votre bean.

public String getDynamicProp() { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

public void setDynamicProp(String input) { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

Ensuite, vous attacher votre JSF directement à l'hélice dynamique:

#{bean.dynamicProp} 

Cependant, cela ne se bloque pas sur les métadonnées comme validateurs et comme vous manquèrent. Cependant, vous pouvez appeler la validation par programme et la gérer vous-même.