【问题标题】:How to save state when extending UIComponentBase扩展 UIComponentBase 时如何保存状态
【发布时间】:2012-03-13 09:35:26
【问题描述】:

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

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

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

    private int currentPageNumber;
    ...

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 快速跟进,如果我想运行一些“一次性”初始化代码,并将其保存到 StateHelper,那么合适的位置是什么?我尝试了构造函数 BFTableComponent 但它还没有可用的属性,并且它运行了多次。
    • 是静态数据吗?使其成为static 变量。如果初始化很复杂,您可以在static {} 中进行。
    • 不,不是静态的。属性之一是用户可以选择初始页面。我想只设置一次。有一次性初始化的地方吗?
    • 听起来更像是候选 bean 属性,而不是 UIComponent 属性。使用托管 bean 代替该属性。
    • 好的。但是为了将来参考,没有这样的构造可用吗?没有办法为 FacesComponent 运行初始化代码?
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多