我在每个using中都包含一个p:tabView
orp:accordionPanel
和 Facelets 。
我的问题是与每个包含的页面关联的 ManagedBeans 在启动时自行初始化,我怎样才能使它们仅在打开特定选项卡时才初始化。
这是代码示例:index.xhtmlp:tab
ui:include
<p:tabView dynamic="true" cache="true">
<p:tab title="Bean 1 Page 1">
<ui:include src="page1.xhtml"/>
</p:tab>
<p:tab title="Bean 2 Page 2">
<ui:include src="page2.xhtml"/>
</p:tab>
</p:tabView>
page1.xhtml
<h:body>
<f:metadata>
<f:event listener="#{bean1.bean1PreRender}" type="preRenderView"/>
</f:metadata>
<h:form>
<h:outputLabel value="#{bean1.bean1Text}"/>
</h:form>
</h:body>
Bean1.java
@ManagedBean
@ViewScoped
public class Bean1 implements Serializable{
private String bean1Text = "Hello From Bean 1";
public Bean1() {
System.out.println("Bean 1 Constructor");
}
@PostConstruct
public void init(){
System.out.println("Bean 1 @PostConstruct");
}
public void bean1PreRender(){
System.out.println("Bean 1 PreRender PostBack Call");
if(!FacesContext.getCurrentInstance().isPostback()){
System.out.println("Bean 1 PreRender NON PostBack Call");
}
}
//SETTER GETTER
}
page2.xhtml
<h:body>
<f:metadata>
<f:event listener="#{bean2.bean2PreRender}" type="preRenderView"/>
</f:metadata>
<h:form>
<h:outputLabel value="#{bean2.bean2Text}"/>
</h:form>
</h:body>
Bean2.java
@ManagedBean
@ViewScoped
public class Bean2 implements Serializable{
private String bean2Text = "Hello From Bean 2";
public Bean2() {
System.out.println("Bean 2 Constructor");
}
@PostConstruct
public void init(){
System.out.println("Bean 2 @PostConstruct");
}
public void bean2PreRender(){
System.out.println("Bean 2 PreRender PostBack Call");
if(!FacesContext.getCurrentInstance().isPostback()){
System.out.println("Bean 2 PreRender NON PostBack Call");
}
}
//SETTER GETTER
}
}
在上面的示例中#{bean1}
,并且在加载自身#{bean2}
时被初始化。
打开的默认选项卡是 Tab1,所以很明显它已加载,但为什么?
我发布这个问题的主要原因是在选项卡之间传输数据,所以如果有任何替代方法,请建议我。index.xhtml
#{bean1}
#{bean2}
*使用:Primfaces 3.5 和 JSF 2.*1