首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF2.0如何创建状态保存的UIComponents?

JSF2.0如何创建状态保存的UIComponents?
EN

Stack Overflow用户
提问于 2010-12-03 08:54:48
回答 1查看 4.1K关注 0票数 3

我试了很简单:

代码语言:javascript
复制
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重新创建组件(捕捉构造函数中的断点)。其结果是,任何实例变量都会丢失。如果数据总是被重新创建,如何将数据保存到组件中?

我试图重写和检查StateHolderPartialStateHolder的状态保存机制:

代码语言:javascript
复制
@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请求保留实例字段)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-03 09:43:19

似乎JSF正在对state对象运行一些预检查,如果没有输入自定义字段,则根本不执行restoreState。只有在实际将自定义值插入状态对象之后,restoreState才会被调用。

例如:

代码语言:javascript
复制
@Override
public Object saveState(FacesContext context) {
    Object[] rtrn = new Object[2];
    rtrn[0] = super.saveState(context);
    rtrn[1] = "dummy";
    return rtrn;
}

在此之后,调用restoreState并按需要还原属性字段。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4343874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档