【问题标题】:When does a JSF 2.0 ViewScoped Bean die?JSF 2.0 ViewScoped Bean 什么时候死掉?
【发布时间】:2012-04-23 14:21:16
【问题描述】:

我想在我的网站中拥有一个基于 Ajax 的选项卡式界面。

我还希望每个选项卡都有一个 bean。
这些 bean 在进入选项卡时应为“born”,而在离开选项卡时应为“die”。

重要提示 - 选项卡之间的切换必须是 AJAX 事件,而不是整页重绘。

我认为@ViewScoped 是此类行为的适当范围,但我被困在离开选项卡时杀死 bean 的问题上。据我所知,@ViewScoped bean 只会在重定向/导航事件中死亡。

有没有合适的方法让@ViewScoped bean 死掉?我应该使用不同的范围吗?

谢谢!

更新

阅读 BalusC 对this 问题的回答是很好的指示:

只要您与同一个视图交互,视图范围的 bean 就会存在 (即您在 bean 操作方法中返回 void 或 null)。当你 导航到另一个视图,例如通过单击链接或返回 不同的操作结果,则视图范围的 bean 将被丢弃 在渲染响应结束时,在下一个请求中不可用。

因此,据此,我可以从操作方法返回不同的结果,并使 @ViewScoped bean 死掉。
但要做到这一点,我必须在操作方法(JSF 2 隐式导航)的结果后禁用导航,我不知道该怎么做(或者这是否是实现我目标的正确方法)

【问题讨论】:

  • This answer 对问题 “视图范围 bean 在 JSF 中如何以及何时销毁?” 可能是相关的。

标签: jsf jsf-2


【解决方案1】:

我将只使用一个 ViewScoped bean,该 bean 将数据显示为一个简单的 POJO 属性。页面将被延迟初始化。

@ManagedBean
@ViewScoped
public class BackingBean {

    private WizardData wizardData;

    public WizardData getWizardData() {
        if (wizardData == null) {
            wizardData = new WizardData();
        }
        return wizardData;
    }

    public void setWizardData(WizardData wizardData) {
        this.wizardData = wizardData;
    }
}

public class WizardData {
    private WizardPage1 page1;
    private WizardPage2 page2;

    public WizardPage1 getPage1() {
        if (page1 == null) {
            page1 = new WizardPage1();
        }
        return page1;
    }

    public void setPage1(WizardPage1 page1) {
        this.page1 = page1;
    }

    public WizardPage2 getPage2() {
        if (page2 == null) {
            page2 = new WizardPage2();
        }
        return page2;
    }

    public void setPage2(WizardPage2 page2) {
        this.page2 = page2;
    }
}

因此,在您使用它们时会在页面上创建 pojo,例如

<h:outputText value="#{backingBean.wizardData.page1.someTextToShow}"/>

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2011-10-25
    • 2012-11-29
    • 1970-01-01
    • 2015-04-15
    • 2014-02-14
    • 2012-09-29
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多