2011-08-23 19 views
6

Ho un componente composito con un'interfaccia che contiene questo:In che modo un componente composito imposta una proprietà nel bean di supporto del client?

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

modo che io possa accedere al posizione oggetto nel markup con # {} cc.attrs.model.location.

ho anche accedere a tale oggetto dal backing bean del componente composito come questo:

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

Così ora la mia componente composito ha fatto il suo lavoro - come faccio io chiamo il metodo setter sul modello della fagiolo di supporto? (Vale a dire model.setLocation (someValue)?

risposta

6

Usa 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); 

Il Application#evaluateExpressionGet() dal modo in cui le chiamate ValueExpression#getValue() sotto le coperte, esattamente come descritto dal suo javadoc (se avete mai letto. ..)


Estranei al problema concreto, sono a conoscenza della possibilità di creare il supporto della classe UIComponent per il componente composito? Scommetto che è molto più facile che giocherellare con ValueExpression in questo modo. È quindi possibile utilizzare il metodo ereditato getAttributes() per ottenere lo model.

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

È possibile trovare un esempio nel nostro composite component wiki page.

+0

Si sta parlando con l'anotation @FacesComponent, giusto? Ho pubblicato un'altra domanda su questo argomento con un tag componente composito e immagino che questo risponda a questa domanda. – AlanObject

+0

Sì, è vero. Vedi anche il wiki collegato. Non ho visto la tua altra domanda. Presta attenzione alla corretta codifica. La gente qui di solito naviga per tag (interessanti). – BalusC

1

E l'attributo "predefinito"? Si ritiene che non sia implementato quando si utilizza l'implementazione del componente di supporto.

xhtml:

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

Java attuazione supporto:

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

se l'attributo di test è impostato nella xhtml principale problema: entrambi xhtml e supporto java hanno lo stesso valore. Ma quando non imposta il valore di default è solo su XHTML: Il HTML contiene

TEST : false 

Ma testvalue è nullo nel sostegno

Problemi correlati