2010-11-26 24 views
4

は、カスタムのUIComponent(テスト目的のみ)考えてみましょう:JSF 2.0:encodeAllはいつ呼び出され、encodeBeginはいつ呼び出されますか?

public class UITest extends UIComponentBase { 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
     System.out.println("encodeBegin"); 
    } 

    @Override 
    public void encodeAll(FacesContext context) throws IOException { 
     System.out.println("encodeAll"); 
    } 

} 

を私は複合コンポーネント内のページに追加すると、encodeBegin()メソッドが呼び出されます。ただし、コンポジットコンポーネント外のページに追加する場合は、代わりにencodeAll()メソッドが呼び出されます。

他のUIComponent内でそれを追加することで、コンポジットコンポーネントラッパーだけが動作を変更するように見えます。

なぜそうであるの情報が見つかりませんでしたか?仕様へのリンク? 。 は、「これらのメソッドはリクエスト処理ライフサイクルのレスポンスのレンダリング・フェーズ中に呼び出されencodeAll()がtrueを返すこのコンポーネントとそのすべての子とファセットを引き起こし ます:

答えて

4

仕様では、それは述べ、この場合は本当に厄介ですgetRendersChildren()戻り値の値の にかかわらず、isRendered()からレンダリングされるencodeBegin()、encodeChildren()および encodeEnd()は、このコンポーネントの先頭の応答データを作成する責任があります。 コンポーネントの子(このコンポーネントのrendersChildrenプロパティがtrueの場合のみ呼び出されます)、末尾が のコンポーネントです。

しかし、これは新しい機能(encodeAll)は、いくつかの点で不完全であるように思わ新旧機能の混合物、のようです:

私は次のことを試してみました:

A)を呼び出しますページ(NOラッパー)に直接成分

  1. 、UIComponentBase(又は等UIInput、UIOutput ..のような他のUIComponentクラス)を拡張タグとして宣言し、UIにそれを使用します。 この場合、encodeAllメソッドが存在する(オーバーライドされている)場合はencodeAllメソッドが呼び出され、そうでない場合はencodeBeginおよびencodeEndメソッドが呼び出されます。

  2. コンポーネントのカスタムレンダラーを作成できるため、レンダリングロジックとビヘイビアを分離することができます。 (レンダラーを拡張する別のクラスを作成し、それを@FacesRendererでアノテートする) これは興味深いところです。レンダラーは、encodeBegin、encodeChildren、およびencodeEnd(encodeAllの記述なし)のみを定義します。 if(encodeAllが存在する場合) else if(UIComponentを拡張するクラスにencodeBegin、Children、またはendのいずれか)が存在する場合は、 else(encodeBegin、childrenまたはendがレンダラーを拡張するクラスに存在する場合) 見つかった対応するメソッドを呼び出します。

これは、UIComponentを拡張するクラスでencodeAll(またはencodeBegin ..など)を実装すると、レンダラーが無視されることを意味します。

B)成分の(CCラッピング:そのencodeAllは、どのような場合に呼び出されなかったこと以外は実施..など)

は、この場合、同じことは関係なく、私が何をしたか、上記のように起こっていません。

結論:encodeAllは、レンダリングコードを実装するための新機能(またはショートカット)のようですが、cc:implementationにはこの場合はバグがあるようです(encodeAllは検索されません)。

私はこれが少なくともあなたにとって価値があると思っていますが、残念ながらもっと徹底した回答はできません。 :( これは他の人には分かっていないようです。

+0

これはかなりわかりました。振る舞いはちょっと複雑で、奇妙なことではないにしても:)これについてのバグを報告するには時間を費やしていただきありがとうございます:) –

+0

[こちら](http://java.net/jira/browse)のバグが報告されています/ JAVASERVERFACES-1875)。 – Lucas

関連する問題