在新浏览器选项卡中重新打开页面时如何重置会话范围的 bean
How to reset session scoped bean when re-opening page in new browser tab
提交值后关闭 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 字符串 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);
}
由于 bean 似乎包含视图范围内的数据(只要您在同一浏览器中回发,视图范围就会存在 window/tab),您应该将其设置为 @ViewScoped
,而不是 @SessionScoped
。这样你也不需要手动创建和销毁 bean。首先将 bean 放在正确的范围内。
另请参阅:
- How to choose the right bean scope?
提交值后关闭 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 字符串 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);
}
由于 bean 似乎包含视图范围内的数据(只要您在同一浏览器中回发,视图范围就会存在 window/tab),您应该将其设置为 @ViewScoped
,而不是 @SessionScoped
。这样你也不需要手动创建和销毁 bean。首先将 bean 放在正确的范围内。
另请参阅:
- How to choose the right bean scope?