我想要的是什么:使用作用于两个不同页面的托管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
。但是,这两种方法methodDoThingsPage1
和methodDoThingsPage2
都被解雇了。
出了什么问题?如果详细方法重定向到page2
,为什么methodDoThingsPage1
也会被解雇?
答案 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");