2010-02-09 21 views
5

¿Cómo puedo vincular dinámicamente un valor de determinado componente en el tiempo de ejecución? Por ejemplo, tengo el siguiente código de componente,Enlace de valor dinámico del componente JSF

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

En mi caso, "# {} bean.someProp" sólo es conocida en tiempo de ejecución.

¿Cuál es la mejor estrategia para implementar esto?

¿Debo atravesar el árbol de componentes y establecer el enlace de valor mediante programación? En caso afirmativo, ¿en qué fase del ciclo de vida JSF debo hacer el recorrido?

Respuesta

15

Puede enlazarlo a una propiedad de grano Map<String, Object> donde la clave String es menos o más el nombre de la propiedad dinámica. Se puede acceder a valores de mapa de EL de la siguiente manera:

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

o

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

que incluso se puede hacer un poco más dinámica, donde someVar resuelve en realidad a un valor String de "someProp":

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

Solo necesita asegurarse de que Map se crea durante la inicialización del bean, de lo contrario JSF no puede acceder los valores del mapa EL, en concreto, no precreatará "propiedades anidadas" para usted. Por lo tanto, p. Ej. instanciación directa:

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

.. o dentro de un constructor o @PostConstruct si lo desea.

+0

Ok entiendo lo que quieres decir. Esta es una buena idea, excepto que perderé todos los metadatos definidos en las anotaciones en mis entidades. Esto también significará perder la ventaja de usar (la etiqueta de validación hibernate de SEAM) y toda la demás infraestructura que depende de los metadatos de la anotación. Para su información, estoy haciendo esto para crear un marco que implemente el patrón de "objeto desnudo" (una implementación de referencia es http://www.nakedobjects.org/). Básicamente, inspecciona una entidad y automáticamente crea tablas y formularios relacionados (en este caso, árbol de componentes). – bungrudi

+0

Urm, ... en el segundo pensamiento, usando este enfoque no tengo que perder todos los metadatos de anotaciones. Voy a intentar esto y dejarte saber. – bungrudi

+0

Esta es la forma en que lo hago actualmente. Al hacer esto, estoy perdiendo la ventaja de y tengo que volver a implementar la validación en otro lugar. Sin embargo, es trivial, solo es cuestión de llamar a hibernateValidator.validate (bean). – bungrudi

0

Otra opción es agregar una capa de abstracción a su 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... 
} 

allí tendría que atar su JSF directamente a la hélice dinámica:

#{bean.dynamicProp} 

Sin embargo, esto no va a aferrarse a los metadatos como validadores y similares estabas deseando. Sin embargo, puede invocar la validación programáticamente y manejarlo usted mismo.

Cuestiones relacionadas