Java 扩展UIComponentBase时如何保存状态

Java 扩展UIComponentBase时如何保存状态,java,jakarta-ee,jsf-2,composite-component,state-saving,Java,Jakarta Ee,Jsf 2,Composite Component,State Saving,我正在创建一个复合组件,它将包装一个datatable以实现非常简单的分页。我需要在ajax请求之间保存状态(当前页码) 我尝试在FacesComponent中创建字段,但我发现它们在JSF生命周期中消失了: @FacesComponent(value = "bfTableComponent") public class BFTableComponent extends UIComponentBase implements NamingContainer { private int c

我正在创建一个复合组件,它将包装一个datatable以实现非常简单的分页。我需要在ajax请求之间保存状态(当前页码)

我尝试在FacesComponent中创建字段,但我发现它们在JSF生命周期中消失了:

@FacesComponent(value = "bfTableComponent")
public class BFTableComponent extends UIComponentBase implements NamingContainer {

    private int currentPageNumber;
    ...
我似乎找不到一个简明的指南来做这件事!创建复合组件时,如何在请求之间保存状态?

使用。它可以在

注意,我在getter中返回一个默认值
0
。您可能希望将
int
更改为
Integer
并删除默认值,以便返回
null



与具体问题无关,为了更简单,您也可以扩展而不是实现
NamingContainer
。通过这种方式,您可以省略被重写的
getFamily()
方法,因为它已经通过
UINamingContainer

正确地实现了。如果我想运行一些“一次性”初始化代码,并将其保存到stateheloper,那么在什么位置执行该操作合适呢?我尝试了构造器BFTableComponent,但它还没有可用的属性,并且它运行了多次。它是静态数据吗?将其设置为
静态变量。如果初始化很复杂,可以在
静态{}
中完成。不,不是静态的。其中一个属性是用户可以选择初始页面。我只想设定一次。是否存在一次性初始化的位置?听起来更像是支持bean属性的候选者,而不是UIComponent属性。对该属性使用托管bean。确定。但为了将来的参考,没有这样的构造可用吗?无法为FacesComponent运行初始化代码?
private enum PropertyKeys {
    currentPageNumber;
}

public void setCurrentPageNumber(int currentPageNumber) {
    getStateHelper().put(PropertyKeys.currentPageNumber, currentPageNumber);
}

public int getCurrentPageNumber() {
    return (int) getStateHelper().eval(PropertyKeys.currentPageNumber, 0);
}