ManagedBean ViewScoped有两页

时间:2014-12-12 13:36:54

标签: jsf

我想要的是什么:使用作用于两个不同页面的托管bean视图。

为什么:在一个页面中我只从databe获取一个列表。而且我不想要另一个托管bean来做这件事。

情景:

托管bean:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@ViewScoped
public class MyManagedBean implements Serializable {

    @PostConstruct
    public void inicio() {

        //used in page page1.xhtml
        if (FacesContext.getCurrentInstance().getViewRoot().getViewId().contains("page1")) {
            methodDoThingsPage1();
        }

        //used in page2.xhtml
        if (FacesContext.getCurrentInstance().getViewRoot().getViewId().contains("page2")) {
            methodDoThingsPage2();
        }
    }

    public String detail(Object object) {
        do(object);
        return "page2?faces-redirect=true";
    }
}

我的页面:

我的page1.xhtml

<p:column>
    <p:commandButton action="#{myManagedBean.detail(object)}">  
</p:column>

我的想法:当我点击page1中的按钮时,只会触发postconstruct中的methodDoThingsPage2。但是,这两种方法methodDoThingsPage1methodDoThingsPage2都被解雇了。

出了什么问题?如果详细方法重定向到page2,为什么methodDoThingsPage1也会被解雇?

4 个答案:

答案 0 :(得分:1)

使用这种方式初始化jsf托管bean而不是@PostConstruct

<f:metadata>
    <f:viewAction action="#{MyManagedBean.init}"/>
</f:metadata>

将这些行添加到jsf文件的开头,并从托管bean中删除@PostConstruct注释。

答案 1 :(得分:0)

这样做非常糟糕。你应该有两个单独的托管bean。

想一想..你真的认为你应该在代码中放置很多if条件吗?而且你也在使用可能导致很多问题的视图名称。如果您修改了视图的名称怎么办?您应该在使用它的任何地方修改代码。

答案 2 :(得分:0)

我在两个页面中使用基类进行常见工作,并在类似情况下从中继承两个managedbean。比使用if更好。但是这样你有多个托管bean。 (还有另一个班级)

答案 3 :(得分:0)

好吧,解决了。

问题是字符串&#34; page1&#34;和&#34;第2页&#34;正在另一个URL中使用。 然后我用了:

FacesContext.getCurrentInstance().getViewRoot().getViewId().endsWith("page1.xhtml");

FacesContext.getCurrentInstance().getViewRoot().getViewId().endsWith("page2.xhtml");