如何在会话范围的bean中初始化变量

时间:2013-05-18 13:28:40

标签: jsf jsf-2 managed-bean

我有两个布尔值来控制某些组件的渲染,问题是变量会保存到最后一个状态,直到会话到期,我

<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";
}

问题是这些值在会话到期之前一直存在,因此组件呈现错误

1 个答案:

答案 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来调用这些方法inEditModesessionmap支持bean。你可以像这样从会话映射中获取bean

ReportPerson rp = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("reportPerson");

从这里,你可以获得当前的bean,你可以从中调用

rp.inEditMode();


通过使用会话范围,您必须根据逻辑更改它们,因为它们将在整个会话期间保持其状态。