我试了很简单:
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重新创建组件(捕捉构造函数中的断点)。其结果是,任何实例变量都会丢失。如果数据总是被重新创建,如何将数据保存到组件中?
我试图重写和检查StateHolder和PartialStateHolder的状态保存机制:
@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实例,但将再次调用saveState方法,而不是restoreState。
如何创建这样的状态保存组件(通过AJAX请求保留实例字段)?
发布于 2010-12-03 09:43:19
似乎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并按需要还原属性字段。
https://stackoverflow.com/questions/4343874
复制相似问题