2016-06-18 4 views
2

プログラムでccで取得します。この例では、インターフェイス定義

<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> 

を私は、属性(例えばcomponent.getAttributes().get("value"))のために行うようにeditableValueHolderに設定されているものを取得したいのですが、私は方法を見つけることができませんでしたそうするには

+0

どこ取得しますか? – Kukeltje

+0

これらの情報を 'component'自身から取得すると、' component.getInterfaces()。get( 'editableValueHolder') 'のようなものが想像できます。これは、複合ターゲットのEditableValueHolderを知ることです。 – Rapster

+0

何も検索しない**コンポーネント内のBean、コンポーネントクラス内の**、** xhtml – Kukeltje

答えて

2

この情報はとして提供されていますのBeanInfo 複合コンポーネントに格納されますによってキーが付けられた複合コンポーネント属性。

public static final String BEANINFO_KEY

この定数の値は、コンポーネント属性マップ、複合コンポーネントを記述するjava.beans.BeanInfo実装されている値のキーとして使用されます。このBeanInfoは、複合コンポーネントBeanInfoとして知られています。

<cc:editableValueHolder>キーAttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEYによって利用可能であるのBeanInfo 複合成分のList<AttachedObjectTarget>プロパティでEditableValueHolderAttachedObjectTargetインスタンスを作成します。

static final String ATTACHED_OBJECT_TARGETS_KEY

複合部品のBeanDescriptorList<AttachedObjectTarget>された値の値セット内のキー。すべてのすべてで

、これはtxtTextを得るために行う必要があります。

<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); 
       // ... 
      } 
     } 

    } 

} 

これはすべてが不必要に不器用である、と述べました。はるかに簡単でmore canonical approachは、子コンポーネントを直接バッキングコンポーネントにバインドするだけです。

<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

私が考えていた方法は、私が決して見つけたことのない最初の部分でした。 – Kukeltje

+0

ありがとうBalusCもう一度! ;) – Rapster

+0

あなたは大歓迎です。 – BalusC

-2

あなたはmanagedBeanを通して望みを得ることができます。

簡単なPOJO:

public class MyObject{ 

private String attribute; 
private String editableValueHolder ; 

//getter and setter 
//... 
} 

あなたManagedBean:

@ManagedBean 
@ViewScoped 
public class myManagedBean{ 

private MyObject selected; 

//getter and setter 
//... 
} 

あなたのWebページ:

<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

: - )...残念ながら、それは簡単ではありません。この質問に使われている概念は、豆の性質だけではなく、コアjsfのものです。 – Kukeltje

関連する問題