什么时候JSF 2.0 ViewScoped Bean死了?

时间:2012-04-11 09:26:34

标签: jsf jsf-2

我想在我的网站上有一个基于Ajax的Tabbed界面。

我还希望每个标签都有一个bean 进入选项卡时,这些bean应该是“ born ”,离开选项卡时,“ die ”。

重要 - 标签之间的切换必须是AJAX事件,而不是整页重绘。

我认为@ViewScoped是这种行为的合适范围,但是当我离开标签时我仍然坚持杀死bean的问题。据我所知,@ViewScoped bean只会在重定向/导航事件中死亡。

有没有正确的方法让@ViewScoped豆死?我应该使用不同的范围吗?

谢谢!

更新

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

  

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

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

1 个答案:

答案 0 :(得分:1)

我只使用一个ViewScoped 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;
    }
}

因此,在页面上,pojos将在您使用时创建,例如:

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