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

我尝试在FacesComponent中创建字段,但是发现它们在JSF生命周期中被清除了:

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

    private int currentPageNumber;
    ...

我似乎找不到在任何地方进行此操作的简明指南!创建复合组件时,如何在请求之间保存状态?

最佳答案

使用 StateHelper 。可以通过 UIComponent#getStateHelper() 获得。

private enum PropertyKeys {
    currentPageNumber;
}

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

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

请注意,我在getter中返回了0的默认值。您可能需要将int更改为Integer并删除默认值,以便返回null

与具体问题无关的,为了更加简单起见,您还可以扩展 UINamingContainer 而不是实现NamingContainer。这样,您可以忽略覆盖的getFamily()方法,因为UINamingContainer已经正确实现了该方法。

09-25 22:22