0

我的导航案例如下。我有一个登录页面,我可以从中导航到商店页面。此商店页面可以使用两种不同的产品目录。这由给定的零售商对象控制。

从商店页面开始,有多个 bean 和页面将依赖于会话中的零售商。切换零售商的事件是来自登录页面的新选择。我可以通过在选择中触发一个动作然后导航到商店页面来控制会话中的零售商。但这必须在 bean 中的一个动作中进行控制。

我的问题是从导航栏直接导航到商店页面的情况。所以我需要一些机制来初始化商店页面中的给定零售商。这必须在该页面所依赖的每个 bean 上执行。这应该通过 GET 参数来完成。我可以在 preRenderView 侦听器处通过复杂的决定来实现这种行为,但我不觉得这是更优雅的方式。

因此,潜在的问题是如何拦截到页面的直接导航,该页面的数据由多个 bean 管理(无论它们的范围如何),并在 session 中引入一些东西,这些 bean 将在它们的操作中使用。

我已经尝试过了(在 SessionScoped bean 中):

1) 如果我使用 @PostConstruct + @ManagedProperty(with param) 我在实例化 bean 时收到错误,因为 bean 是 SessionScoped

2)如果我使用 viewParam + preRenderView 事件,则在事件之前注入参数并获得我想要的行为,但是每次加载页面时都会发生这种情况。

我希望这个初始化只发生一次,并且我想使用 GET 参数。

我该怎么做?

4

1 回答 1

1

其中一种方法是仅在f:viewParam值仍然为时才执行工作null

public void init() {
    if (value == null) {
        // ...
    }
}

另一种方法是仅在非回发时执行该工作:

public void init() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

请注意,当在同一会话中触发新的 GET 请求时,这仍然会执行,并且您通常希望为此使用@ViewScopedbean 来防止多个浏览器选项卡/窗口相互干扰。

也可以看看:

于 2013-01-04T19:03:02.177 回答