は、私は単純に試してみました: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はコンポーネントを再作成します(コンストラクタ内のブレークポイントは捕捉されます)。この結果、インスタンス変数はすべて失われます。それらがいつも再作成されたら、コンポーネントにデータを保存する方法はありますか?
は私がオーバーライドし、運wihoutStateHolder
と
PartialStateHolder
のメカニズムを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リクエストでインスタンスフィールドを保持する)を作成するにはどうすればよいですか?