在提交值后关闭xhtml页面(primefaces)上的选项卡后,我重新打开一个新选项卡,选择相同的bean,旧值仍然存在。我想打开一个带有默认值的新选项卡(支持bean的新实例)。
XHTML页面
<h:form>
<p:layout style="min-width:400px;min-height:700px" >
<p:layoutUnit position="west" style="min-width:200px;min-height:50px">
<ui:include src="Menu.xhtml" />
</p:layoutUnit>
<p:layoutUnit position="center" >
<p style="text-align:center">Welcome</p>
<p:tabView dynamic="false" widgetVar="tabView">
<p:ajax event="tabClose" listener="#{requestCalculation.onTabClosed}"/>
<c:forEach items="#{requestCalculation.formTabs}" var="listItem">
<p:tab title="#{listItem.formTitle}" closable="true" >
<ui:include src="#{listItem.formPage}" />
</p:tab>
</c:forEach>
</p:tabView>
<h:panelGrid columns="2">
<h:commandButton value="Calculate" action = "#{requestCalculation.calculate}"/>
<h:commandButton value="Reset" action = "#{requestCalculation.resetPage}"/>
</h:panelGrid>
</p:layoutUnit>
</p:layout>
</h:form>
支持Bean
public String loadForm(TcsBase loadForm){
id = loadForm.getId();
ViewTabs tab = new ViewTabs();
tab.setFormTitle("Form".concat(id));
tab.setFormPage("Form".concat(id).concat(".xhtml"));
formTabs.add(tab);
calcReq.getFormCollection().add(loadForm);
System.out.println(loadForm.getId());
return "Main";
}
public void onTabClosed(TabCloseEvent e){
TabView tabView = (TabView) e.getComponent();
int closingTabIndex = tabView.getChildren().indexOf(e.getTab());
removeForm(closingTabIndex);
}
public void removeForm(int index){
calcReq.getFormCollection().remove(index);
formTabs.remove(index);
}
答案 0 :(得分:2)
由于bean似乎保存了视图范围数据(只要您在同一浏览器窗口/选项卡中进行回发,视图范围就会存在),您应该将其设为@ViewScoped
,而不是@SessionScoped
。这样你也不需要手动创建和销毁bean。只需将豆放在正确的范围内即可。