2012-02-23 4 views
4

非常に単純なページングを実装するためにデータテーブルをラップするコンポジットコンポーネントを作成しています。私はajax要求の間に状態(現在のページ番号)を保存する必要があります。UIComponentBaseを拡張するときに状態を保存する方法

は、私は私のFacesComponentのフィールドを作成しようとしたが、私は、彼らはJSFのライフサイクルの間に一掃されて発見された:

@FacesComponent(value = "bfTableComponent") 
public class BFTableComponent extends UIComponentBase implements NamingContainer { 

    private int currentPageNumber; 
    ... 

私はこれのどこをやっに簡潔なガイドを見つけるように見えることはできません!コンポジットコンポーネントを作成するときに、リクエスト間で状態を保存する方法はありますか?

答えて

9

StateHelperを使用してください。それはUIComponent#getStateHelper()によって利用可能です。私はゲッターに0のデフォルト値を返すよ

private enum PropertyKeys { 
    currentPageNumber; 
} 

public void setCurrentPageNumber(int currentPageNumber) { 
    getStateHelper().put(PropertyKeys.currentPageNumber, currentPageNumber); 
} 

public int getCurrentPageNumber() { 
    return (int) getStateHelper().eval(PropertyKeys.currentPageNumber, 0); 
} 

注意。 intIntegerに変更し、デフォルト値を削除してnullが返されるようにすることができます。具体的な問題への無関係


、あなたはより簡単にするためにも、だけではなく、NamingContainerを実装するのでUINamingContainerを拡張することができます。この方法では、オーバーライドされたgetFamily()メソッドは既に実装されているため、UINamingContainerによって省略することができます。

+0

「ワンタイム」初期化コードを実行してStateHelperに保存したい場合は、それを実行するのに適切な場所は何でしょうか?私はコンストラクタBFTableComponentを試しましたが、まだ利用可能なプロパティはなく、複数回実行されています。 –

+0

静的なデータですか? 'static'変数にします。初期化が複雑な場合は、 'static {}'で行うことができます。 – BalusC

+0

いいえ、静的ではありません。属性の1つは、ユーザーが最初のページを選択できることです。私はそれをちょうど1回設定したいと思います。一度初期化する場所はありますか? –