如何在扩展UIComponentBase时保存状态

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

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

@FacesComponent(value = "bfTableComponent") public class BFTableComponent extends UIComponentBase implements NamingContainer { private int currentPageNumber; ... 

我似乎无法find一个简洁的指南来做到这一点! 在创build复合组件时,如何在请求之间保存状态?

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