Java 扩展UIComponentBase时如何保存状态
我正在创建一个复合组件,它将包装一个datatable以实现非常简单的分页。我需要在ajax请求之间保存状态(当前页码) 我尝试在FacesComponent中创建字段,但我发现它们在JSF生命周期中消失了: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
@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);
}