gpt4 book ai didi

JSF 2.0 如何创建状态保存的 UIComponents?

转载 作者:行者123 更新时间:2023-12-02 00:36:38 27 4
gpt4 key购买 nike

我简单地试了一下:

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 的状态保存机制,但没有成功:

@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 请求保留实例字段)?

最佳答案

似乎 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 并且可以根据需要恢复属性字段。

关于JSF 2.0 如何创建状态保存的 UIComponents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com