2016-06-18 28 views
2

In diesem Beispiel:Get programmatisch cc: Schnittstellendefinition

<composite:interface> 
    <composite:attribute name="value" required="false" /> 
    <composite:editableValueHolder name="txtText"/> 
</composite:interface> 

<composite:implementation> 
    <h:inputText id="txtText" value="#{cc.attrs.value}" /> 
</composite:implementation> 

Ich mag würde holen, was zu editableValueHolder eingestellt wurde, wie ich für Attribute tun würde (zB component.getAttributes().get("value")), aber ich habe nicht Methode finden Um dies zu tun

+0

abrufen, wo? – Kukeltje

+0

Holen Sie sich diese Informationen von 'component' selbst, ich würde mir etwas wie' component.getInterfaces(). Get ('editableValueHolder') 'vorstellen.Das Ziel davon ist, zu wissen, welche EditableValueHolder meine zusammengesetzten Ziele – Rapster

+0

nicht abrufen, was, abrufen ** wo **, in einer Bean, Komponente Klasse, in der Komponente xhtml – Kukeltje

Antwort

2

Diese Informationen in Verbundbauteil BeanInfo dem gespeichert ist, als Composite Component-Attribut, das voncodiert wird.

public static final String BEANINFO_KEY

Der Wert dieser Konstante als Schlüssel in der Komponente Attributabbildung verwendet wird, ist der Wert für die eine java.beans.BeanInfo Implementierung der Verbundkomponente beschreibt. Diese BeanInfo ist bekannt als die Verbundkomponente BeanInfo.

Die <cc:editableValueHolder> schafft eine EditableValueHolderAttachedObjectTarget Instanz im List<AttachedObjectTarget> Eigenschaft des Verbundbauteils BeanInfo, die durch den Schlüssel AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY verfügbar ist.

static final String ATTACHED_OBJECT_TARGETS_KEY

Der Schlüssel in dem Wertesatz der Verbundbauteils BeanDescriptor, ist der Wert für die ein List<AttachedObjectTarget>.

Alles in allem sollte dies tun, um die txtText zu bekommen:

<cc:interface componentType="yourComposite"> 
    ... 
    <cc:editableValueHolder name="txtText" /> 
</cc:interface> 
<cc:implementation> 
    <f:event type="postAddToView" listener="#{cc.init}" /> 
    <h:inputText id="txtText" ... /> 
    ... 
</cc:implementation> 

@FacesComponent("yourComposite") 
public class YourComposite extends UINamingContainer { 

    public void init() { 
     BeanInfo info = (BeanInfo) getAttributes().get(UIComponent.BEANINFO_KEY); 
     List<AttachedObjectTarget> targets = (List<AttachedObjectTarget>) info.getBeanDescriptor().getValue(AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY); 

     for (AttachedObjectTarget target : targets) { 
      if (target instanceof EditableValueHolderAttachedObjectTarget) { 
       String name = target.getName(); 
       UIInput txtText = (UIInput) findComponent(name); 
       // ... 
      } 
     } 

    } 

} 

sagte, dass das alles unnötig ungeschickt ist. Viel einfacher und die more canonical approach ist nur die untergeordnete Komponente direkt an die unterstützende Komponente zu binden.

<cc:interface componentType="yourComposite"> 
    ... 
    <cc:editableValueHolder name="txtText" /> 
</cc:interface> 
<cc:implementation> 
    <h:inputText binding="#{cc.txtText}" ... /> 
    ... 
</cc:implementation> 

@FacesComponent("yourComposite") 
public class YourComposite extends UINamingContainer { 

    private UIInput txtText; // +getter+setter 

    // ... 
} 
+0

Der "nicht-ungeschickte" Weg war, woran ich dachte, der erste Teil, den ich niemals herausgefunden hätte. – Kukeltje

+0

Danke BalusC noch einmal! ;) – Rapster

+0

Gern geschehen. – BalusC

-2

Sie können bekommen, was Sie wollen über die ManagedBean.

Eine einfache POJO:

public class MyObject{ 

private String attribute; 
private String editableValueHolder ; 

//getter and setter 
//... 
} 

Ihre ManagedBean:

@ManagedBean 
@ViewScoped 
public class myManagedBean{ 

private MyObject selected; 

//getter and setter 
//... 
} 

Ihre Webseite:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:myLib="http://lib.dz/taglib"> 

<h:form> 

<h:panelGrid columns="2"> 
    <h:outputText value="Attribute" /> 
    <h:inputText value="#{myManagedBean.attribute}" /> 
    <h:outputText value="EditableValueHolder " /> 
    <h:inputText value="#{myManagedBean.editableValueHolder }" /> 
</h:panelGrid> 

</h:form> 
</ui:composition> 
+1

: -) ... leider ist es nicht so einfach. Die Konzepte, die in der Frage verwendet werden, sind Core-JSF-Dinge, nicht nur Bean-Eigenschaften. – Kukeltje