我有两个布尔值来控制某些组件的渲染,问题是变量会保存到最后一个状态,直到会话到期,我
<f:facet name="footer">
<p:commandButton action="#{personBean.report}" ajax="false" value="Publish"
rendered="#{personBean.reportMode}" icon="ui-icon-check" />
<p:commandButton action="#{personBean.saveEditing}" ajax="false" value="Save"
rendered="#{personBean.editMode}" icon="ui-icon-check" />
</f:facet>
bean是会话范围的,具有以下属性:
@ManagedBean(name = "personBean")
@SessionScoped
public class ReportPerson {
private boolean editMode;
private boolean reportMode;
}
bean包含这些改变布尔值的方法:
public String editPerson() {
System.err.println("Edit Missing Person");
editMode = true;
reportMode = false;
return "ReportNewPerson";
}
问题是这些值在会话到期之前一直存在,因此组件呈现错误
答案 0 :(得分:1)
如果您正在使用会话范围的bean,那么您应该在构造函数中初始化它们,如
public ReportPerson(){
//let say you want to show report mode by default
editMode = false;
reportMode = true;
}
之后,创建两个方法,如
public void inEditMode(){
editMode = true;
reportMode = false;
}
public void inReportMode(){
editMode = false;
reportMode = true;
}
现在在渲染cpomponent上调用#{reportPerson.editMode}
和#{reportPerson.reportMode}
,并通过从inReportMode()
获取bean来调用这些方法inEditMode
和sessionmap
支持bean。你可以像这样从会话映射中获取bean
ReportPerson rp = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("reportPerson");
从这里,你可以获得当前的bean,你可以从中调用
rp.inEditMode();
通过使用会话范围,您必须根据逻辑更改它们,因为它们将在整个会话期间保持其状态。