2010-12-03 3 views
3

は、私は単純に試してみました:JSF 2.0状態を保存するUIComponentを作成する方法は?

public class UIDemoComponent extends UIComponentBase { 

    private String someVariable; // this gets always cleared, getters/setters omitted 

    public UIDemoComponent() { 
     super(); // place breakpoint here 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 

     HtmlForm form = new HtmlForm(); 
     form.setStyle("padding: 10px; background-color: blue;"); 
     getChildren().add(form); 

     AjaxBehavior behavior = new AjaxBehavior(); 
     behavior.setRender(Arrays.asList("@form")); 
     form.addClientBehavior("click", behavior); 
    } 
} 

私は、タグハンドラを登録していると正常にページにコンポーネントを挿入します。しかし、レンダリングされる青いフォームをクリックすると、JSFはコンポーネントを再作成します(コンストラクタ内のブレークポイントは捕捉されます)。この結果、インスタンス変数はすべて失われます。それらがいつも再作成されたら、コンポーネントにデータを保存する方法はありますか?

は私がオーバーライドし、運wihout StateHolderPartialStateHolderのメカニズムをstaving状態を検査しようとした:

@Override 
public Object saveState(FacesContext context) { 
    return super.saveState(context); // breakpoint 
} 

@Override 
public void restoreState(FacesContext context, Object state) { 
    super.restoreState(context, state); // breakpoint 
} 

JSFページおよびコンポーネントが作成されsaveStateを実行しているが、restoreStateが呼び出されることはありません。実際には、AJAXリクエストが処理されているときに、UIDemoComponentの新しいインスタンスが作成されますが、の代わりにメソッドがとなり、となります。

このような状態保存コンポーネント(AJAXリクエストでインスタンスフィールドを保持する)を作成するにはどうすればよいですか?

答えて

3

JSFのように、stateオブジェクトでいくつかの事前チェックが実行されており、カスタムフィールドが入力されていない場合は、restoreStateを実行していないようです。状態オブジェクトに実際にカスタム値を挿入した後にのみ、restoreStateが呼び出されます。例えば

:この後

@Override 
public Object saveState(FacesContext context) { 
    Object[] rtrn = new Object[2]; 
    rtrn[0] = super.saveState(context); 
    rtrn[1] = "dummy"; 
    return rtrn; 
} 

restoreStateが呼び出されますと望んでいたとして、プロパティフィールドを復元することができます。

関連する問題