刷新组件绑定到请求范围的 bean

Posted

技术标签:

【中文标题】刷新组件绑定到请求范围的 bean【英文标题】:Refreshing a component bind to request-scoped bean 【发布时间】:2012-08-01 04:37:00 【问题描述】:

有没有人可以解决这样的问题:

在我的应用程序中,我使用了一个基于 primefaces 仪表板的复杂的、以编程方式构建的仪表板。为了克服构建仪表板的面板的非唯一 id 的问题,我将此组件绑定到请求范围的 bean。单击命令按钮后,我还想根据一些可变参数重建仪表板。

问题是,仪表板的 getter 是在 Apply Request Values 阶段触发的,远在 commandButton 的 actionListener 触发之前(在 Invoke Application 阶段)。因此,尽管仪表板最终会重建,但它并没有在呈现的响应中刷新。

另一方面,如果我尝试将按钮的 immediate 属性设置为 true,则 actionListener 在 Apply Request Values 阶段被触发,但仍在 getter 之后。比生命周期直接进入 Render Response 阶段,结果是一样的。

有人吗?


感谢您的回答。让我为我的问题添加一点细节。

我将体育比赛的模型存储为会话范围 bean 的属性。它是这样的:bean 有一个属性“比赛”。这个类有一个组列表,每个组都有它的匹配表。这个想法是使用三个不同的程序构建组件作为这个锦标赛模型的渲染器。

仪表板将用于参赛者分组放置的拖放版。为了查看比赛表格和编辑他们的比赛,我使用了一个标签面板,每个表格都有面板网格。最后,我使用面板网格来显示锦标赛树。这三个组件中的每一个都呈现模型的某些部分供用户编辑。

由于模型(以及那些渲染组件)是根据可选参数(例如组数)动态构建的,因此在将它们绑定到会话范围的 bean 时,我遇到了 id uniqnes 的问题。所以我将它们绑定到一个请求范围的bean。随着每个请求更改模型(主要是 ajax),我想根据用户设置的参数(也存储在会话范围的 bean 中)重新渲染这些组件。

问题是,当我在调用应用程序阶段(在由“rebuild-my-model”按钮触发的动作侦听器中)重建模型时,绑定到请求范围 bean 的组件已经被“get -ed”来自 bean(或者看起来如此),并且它们不会在页面上刷新。

如果上面提到的方法完全愚蠢,我将非常感谢您提供我做错了什么的线索,也许还有一个建议:)

【问题讨论】:

问题解决了,感谢 BalusC。这个想法是为每个请求的组件设置一个新模型,而不是尝试在代码中手动创建和替换它们。 【参考方案1】:

问题是,仪表板的 getter 在应用请求值阶段被触发,在 commandButton 的 actionListener 被触发之前

我不确定为什么这会给您带来问题。也许您在 getter 方法而不是在动作侦听器方法中错误地执行业务逻辑?或者您可能是手动创建组件而不是引用 JSF 创建的组件,因此总是覆盖 JSF 视图中的组件?

一个合适的 JSF getter 方法基本上如下所示:

public UIComponent getDashboard() 
    return dashboard;

它应该包含任何其他代码行。顺便说一句,这同样适用于 setter 方法。任何需要操作组件子级的操作都需要在 action(listener) 方法中完成,而不是在 getter/setter 方法中。

【讨论】:

以上是关于刷新组件绑定到请求范围的 bean的主要内容,如果未能解决你的问题,请参考以下文章

将请求范围的 bean 自动装配到应用程序范围的 bean 中

为啥我可以在没有请求的情况下注入请求范围的 bean?

Spring:如何将 HttpServletRequest 注入到请求范围的 bean 中?

Spring将请求范围的bean提升到子线程(HttpServletRequest)

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

在实际 Web 请求之外使用请求范围的 bean