2010-02-09 16 views
5

Come si esegue il bind di un determinato componente dinamicamente al runtime? Per esempio, ho il seguente tag componente,Associazione del valore dinamico del componente JSF

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

Nel mio caso, "# {} bean.someProp" è noto solo in fase di esecuzione.

Qual è la migliore strategia per implementare questo?

Devo attraversare l'albero dei componenti e impostare il valore di associazione a livello di codice? Se sì, in quale fase del ciclo di vita di JSF dovrei fare il movimento?

risposta

15

È possibile associarlo a una proprietà bean Map<String, Object> in cui la chiave String è inferiore o superiore al nome della proprietà dinamica. È possibile accedere a valori della mappa in EL seguente modo:

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

o

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

che può anche essere fatto un po 'più dinamico in cui someVar in realtà si risolve in un valore String di "someProp":

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

È necessario solo assicurarsi che lo Map venga creato durante l'inizializzazione del bean, altrimenti JSF non può accedere i valori della mappa. EL vale a dire che non precorrerà per te "proprietà annidate". Quindi, ad es. esemplificazione diretta:

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

.. o all'interno di un costruttore o @PostConstruct, se volete.

+0

Ok, capisco cosa intendi. Questa è una buona idea, tranne per il fatto che perderò tutti i metadati definiti nelle annotazioni nelle mie entità. Ciò significa anche perdere il vantaggio dell'utilizzo di (il tag di convalida dell'ibernazione da SEAM) e di tutte le altre infrastrutture che dipendono dai metadati delle annotazioni. FYI, sto facendo questo per creare un framework che implementa il pattern 'naked object' (una implementazione ref è http://www.nakedobjects.org/). Fondamentalmente ispeziona un'entità e crea automaticamente tabelle e moduli correlati (in questo caso, albero dei componenti). – bungrudi

+0

Urm, ... al secondo pensiero, usando questo approccio non devo perdere tutti quei metadati delle annotazioni. Ci proverò e ti faccio sapere. – bungrudi

+0

Questo è il modo in cui lo faccio al momento. In questo modo, sto perdendo il vantaggio di e devo ri-implementare la convalida da qualche altra parte. È banale, però, solo una questione di chiamare hibernateValidator.validate (bean). – bungrudi

0

Un'altra opzione è che è possibile aggiungere uno strato di astrazione al 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... 
} 

Poi si dovrebbe legare il JSF direttamente al prop dinamica:

#{bean.dynamicProp} 

Tuttavia, questo non si bloccherà al metadati come validatori e come se stessi vogliono. Tuttavia, è possibile richiamare in modo programmatico la convalida e gestirla autonomamente.

Problemi correlati