2013-05-18 93 views
0

我有兩個布爾控制渲染某些組件的,問題是,直到會話過期的變量保存有最後的狀態,我在會話如何初始化變量範圍的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; 

} 

豆含有這些方法是改變布爾值:

public String editPerson() { 
    System.err.println("Edit Missing Person"); 
    editMode = true; 
    reportMode = false; 
    return "ReportNewPerson"; 
} 

的問題是,這些值將一直保持到會話過期,因此部件呈現不正確

回答

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


現在撥打#{reportPerson.editMode}#{reportPerson.reportMode}您呈現cpomponent並調用這些方法inReportMode()inEditMode在你的後盾正從sessionmap豆bean.You可以從sessionmap獲取Bean這樣

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

由此看來,你可以得到當前Bean,並從這一點,你可以調用

rp.inEditMode(); 


作爲使用會話範圍,你有你的邏輯來改變他們,因爲他們將保持其狀態保持在整個會議期間。

+0

好的,我可以調用triggerReportMode()我想調用這些方法,當用戶報告一個新的人,換句話說如何顯式調用會話scoped bean的構造函數? –

+0

構造函數在bean對象被創建時自動調用,JSF框架負責處理該構造函數。但是,我不會建議在一個bean的構造函數中初始化任何東西,在'private void init()'(方法的名稱和範圍可以由您選擇)中使用'@ PostConstruct'註釋來執行。 – Manuel

+0

@Manuel很好的建議:)但你能解釋init方法優於構造函數的優缺點 – Freak

相關問題