2011-08-23 3 views
6

私はこれを含まインタフェースとの複合成分を有する:どのように複合コンポーネントがクライアントのバッキングBeanにプロパティを設定しましたか?

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

だから#{cc.attrs.model.location}とマークアップで場所オブジェクトにアクセスすることができます。

私はまた、このような複合コンポーネントのバッキングBeanから、そのオブジェクトにアクセス:

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

はだから今、私の複合コンポーネントがその作業を行っている - どのように私はからモデルのセッターメソッドを呼び出しますバッキングビーンですか?あなたはそれを読んだことがある場合(すなわちmodel.setLocation(someValueの)

答えて

6

使用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); 

Application#evaluateExpressionGet()方法によっては(そのjavadocで説明とおりに、カバーの下ValueExpression#getValue()を呼び出します。 ...)

具体的な問題への無関係

、あなたがする可能性について認識していますコンポジットコンポーネントのバックファイルUIComponentを作成しますか?私はこれがValueExpressionのように手を出すよりずっと簡単だと確信しています。継承されたgetAttributes()メソッドを使用してmodelを取得することができます。

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

composite component wiki pageに例があります。

+0

をバックにnullであるあなたは正しい、@FacesComponentの注釈を使用して話しているの?私はこのトピックに関する別の質問を複合コンポーネントタグで掲示しました。そして、私はこの質問に答えると思います。 – AlanObject

+0

はい、そうです。リンクされたwikiも参照してください。私はあなたの他の質問を見ていない。適切なタグ付けに注意してください。ここの人々は通常、(面白い)タグをブラウズします。 – BalusC

1

属性「default」はどうですか?これは、バッキングコンポーネントの実装を使用する際に実装されていないことを示しています。

XHTML:

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

のJavaバッキング実装:テスト属性はメインXHTMLで何ら問題は設定されていない場合

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

:XHTMLとJavaの裏の両方が同じ値を持っています。デフォルト値は唯一のxhtmlの上にある設定されていないときでも: HTMLは

TEST : false 

が含まれています。しかしここでtestValueが

関連する問題