我正在使用primefaces tabView
组件。每个标记都有自己的托管bean和引用该bean的.xhtml页面。
问题是单击了EACH TIME选项卡,应该从数据库中提取新数据(不仅仅是第一次),换句话说,应该刷新数据。
我的豆子是@ViewScoped
。我不想使用@RequestScoped
,因为我有非常动态的启用Ajax的页面。
我的解决方案目前看起来像这样:
我使用tabView
组件(MainBean
)为主页提供了托管bean,其中包含处理tabChange
事件的方法。
该bean还引用了分配给每个选项卡(TabBean1
,TabBean2
)的bean,以便根据所选选项卡的id
刷新右bean。
MainBean:
@ManagedBean(name = "mainBean")
@ViewScoped
public class MainBean implements Serializable {
private static final long serialVersionUID = 1L;
@ManagedProperty(value = "#{tabBean1}")
private TabBean1 tabBean1;
@ManagedProperty(value = "#{tabBean2}")
private TabBean2 tabBean2;
public void onTabChange(TabChangeEvent event) {
String id = event.getTab().getId();
if ("tab1Id".equals(id)) {
tabBean1.init();
} else if ("tab2Id".equals(id)) {
tabBean2.init();
}
}
public TabBean1 getTabBean1() {
return tabBean1;
}
public void setTabBean1(TabBean1 tabBean1) {
this.tabBean1 = tabBean1;
}
public TabBean2 getTabBean2() {
return tabBean2;
}
public void setTabBean2(TabBean2 tabBean2) {
this.tabBean2 = tabBean2;
}
}
TabBean1:
@ManagedBean(name = "tabBean1")
@ViewScoped
public class TabBean1 implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> data;
@PostConstruct
public void init() {
// refresh data
}
}
TabBean2:
@ManagedBean(name = "tabBean2")
@ViewScoped
public class TabBean2 implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> data;
@PostConstruct
public void init() {
// refresh data
}
}
相关部分od main.xhtml:
<p:tabView id="tabViewID" cache="false" dynamic="true">
<p:ajax event="tabChange" listener="#{mainBean.onTabChange}" />
<p:tab title="Tab 1" id="tab1Id">
<ui:include src="tab1Page.xhtml" />
</p:tab>
<p:tab title="Tab 2" id="tab2Id">
<ui:include src="tab2Page.xhtml" />
</p:tab>
</p:tabView>
这种方法的问题是:
MainBean
时,也会构造其所有托管属性。这是一个很大的问题,因为每个bean的@PostConstruct
方法从数据库中获取一些数据而且一切都太慢了,因为只有一个bean应该被初始化(分配给选定选项卡的那个),所有bean都被初始化了。init()
方法被TabBean1
调用两次,一次因@PostConstruct
而被调用一次,因为它被分配到tabChange
事件(第一个标签被选中)默认情况下)我的问题是:
我真的很感激你的建议。谢谢!
我正在使用Primefaces 6.0,JSF 2.2。