我的导航案例如下。我有一个登录页面,我可以从中导航到商店页面。此商店页面可以使用两个不同的产品目录。这由给定的零售商对象控制。
从商店页面开始,有多个bean和页面将依赖于会话中的零售商。切换零售商的事件是登录页面中的新选择。 我可以通过在选择中触发一个动作然后导航到商店页面来控制会话中的零售商。但这必须在bean中的动作中进行控制。
我的问题是从导航栏直接导航到商店页面的情况。所以我需要一些机制来初始化商店页面中的给定零售商。并且必须在此页面所依赖的每个bean上执行此操作。这应该通过GET参数来完成。 我可以在preRenderView监听器上做出复杂的决定,但我觉得这不是更优雅的方式。
因此,潜在的问题是如何拦截直接导航到数据由几个bean管理的页面(无论它们的范围),并在会话中引入一些东西,这些豆子将在他们的行动中使用。
我试过这个(在SessionScoped bean中):
1)如果我使用@PostConstruct + @ManagedProperty(使用param)我在实例化bean时收到错误,因为bean是SessionScoped
2)如果我使用viewParam + preRenderView事件,则在事件之前注入param并获得我想要的行为,但每次加载页面时都会发生这种情况。
我希望这个初始化只发生一次,我想使用GET参数。
我该怎么做?
答案 0 :(得分:1)
其中一种方法是仅在f:viewParam
值仍为null
的情况下执行作业。
public void init() {
if (value == null) {
// ...
}
}
另一种方法是仅在非回发上执行作业:
public void init() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
请注意,当在同一会话中触发新的GET请求时,仍然会执行此操作,并且您通常希望使用@ViewScoped
bean来防止多个浏览器选项卡/窗口相互干扰