扩展UIComponentBase时如何保存状态

时间:2012-02-23 00:11:26

标签: java java-ee jsf-2 composite-component state-saving

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

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

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

    private int currentPageNumber;
    ...

我似乎无法在任何地方找到这样做的简明指南!在创建复合组件时如何在请求之间保存状态?

1 个答案:

答案 0 :(得分:10)

使用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正确实现。