2011-08-23 13 views
6

que tienen un componente compuesto con una interfaz que contiene lo siguiente:¿Cómo establece un componente compuesto una propiedad en el bean de respaldo de su cliente?

<cc:attribute name="model" 
        shortDescription="Bean that contains Location" > 
     <cc:attribute name="location" type="pkg.Location" 
         required="true" /> 
    </cc:attribute> 
</cc:interface> 

Por lo tanto, puede acceder a la ubicación objeto en el marcado con # {} cc.attrs.model.location.

también puedo acceder a ese objeto del bean de respaldo de la pieza compuesta así:

FacesContext fc = FacesContext.getCurrentInstance(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, 
      "#{cc.attrs.model.location}", Location.class); 

Así que ahora mi pieza compuesta ha hecho su trabajo - Como llamar en el método de selección en el modelo de la respaldo de frijol? (Es decir, model.setLocation (someValue)?

Respuesta

6

Uso ValueExpression#setValue().

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ELContext elContext = facesContext.getELContext(); 
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory() 
    .createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class); 

valueExpression.setValue(elContext, newLocation); 

El Application#evaluateExpressionGet() por cierto llama ValueExpression#getValue() bajo las sábanas, exactamente como se describe por su javadoc (si alguna vez lo ha leído. ..)


Sin relación al problema concreto, ¿está usted consciente de la posibilidad de crear clase de respaldo UIComponent para el componente compuesto? Apuesto a que esto es mucho más fácil que jugar con ValueExpression s de esta manera. A continuación, puede utilizar el método heredado getAttributes() para obtener el model.

Model model = (Model) getAttributes().get("model); 
// ... 

Puede encontrar un ejemplo en nuestra composite component wiki page.

+0

Usted está hablando acerca del uso de la anotation @FacesComponent, ¿verdad? Había publicado otra pregunta sobre este tema con una etiqueta de componente compuesto y creo que esto responde esa pregunta. – AlanObject

+0

Sí, eso es correcto. Ver también la wiki vinculada. No he visto tu otra pregunta. Preste atención al etiquetado adecuado. La gente aquí generalmente navega por etiquetas (interesantes). – BalusC

1

¿qué pasa con el atributo "predeterminado"? Parece que no está implementado cuando se usa la implementación del componente de respaldo.

XHTML:

<composite:interface> 
    <composite:attribute name="test" 
         type="java.lang.Boolean" 
         default="#{false}"/> 
</composite:interface> 
<composite:implementation > 
    TEST : #{cc.attrs.test} 
</composite:implementation > 

Java aplicación respaldo:

testValue = (Boolean) getAttributes().get("test"); 

si el atributo de prueba se encuentra en el XHTML principal no hay problema: tanto XHTML y el respaldo de Java tienen el mismo valor. Pero cuando no se establece el valor predeterminado es sólo en XHTML: El HTML contiene

TEST : false 

pero TestValue es nulo en el respaldo

Cuestiones relacionadas