2012-03-07 99 views
6

我有一個報告生成頁面,其中有幾個篩選器,例如countryId,Date以及其他幾個供用戶選擇的參數。現在基於所選的參數,有一個數據庫調用,它使用這些參數來獲取結果列表。在另一個受管Bean中訪問JSF受管bean的值

現在管理的bean包含了所有這些搜索參數和結果列表。讓我們命名這個bean作爲Bean1

public class Bean1 implements Constants{ 
    private List<SelectItem> countryList; 
    private List<String> choosenCountryList; 
    private List<String> choosenProgramList; 
    private String invoiceDatePriorTo= CalendarUtilities.getTodaysDate() ; 
    private List<CustomResults> searchResultList 
} 

我們還有一個管理的bean Bean2其中包含Bean1

public class Bean2 implements Constants { 
    private Bean1 bean1; 

    public getSearchResults(){ 
     //Code for fetching the search list for bean 1 
     this.setsearchResultList() //=fetched list from DB; 
    } 

    public modifySearchResults(){} 
} 
屬性

現在,當從JSF頁面觸發一個動作時,我們調用getSearchResults()方法,並且我們將searchResultList設置爲在屏幕上顯示。這樣我們就能夠在屏幕上顯示搜索列表

現在,我們得到的列表將在屏幕上經過用戶修改。現在,當我們再次調用modifySearchResults來編輯列表時,我們無法檢索bean2中的列表,因爲託管bean是在請求範圍內。

有誰能告訴我如何繼續解決這個問題嗎?

回答

11

就宣佈你爲公司Databeans managedProperty

從標籤我承擔其約JSF2.0

需要聲明bean1爲託管財產bean2

它應該看起來像

@ManagedBean 
public class Bean1{ 
} 

and

@ManagedBean 
public class Bean2{ 

    @ManagedProperty(value="#{bean1}") 
    Bean1 bean1; 
    //setter & getter of bean1 

} 

請參見

+0

u能細說位? – Sam 2012-03-07 13:12:38

+1

你讀過這篇文章了嗎? – 2012-03-07 13:17:53

+0

是在我的bean2 bean1是一個託管屬性已經... – Sam 2012-03-07 13:20:43

4

好你自己說的。你必須從RequestScope移動bean。

根據您的應用程序,你可能要使用:

  • @SessionScoped
  • @ViewScoped

Here你可以找到關於選擇合適範圍的條款。

其次,您可能要使用依賴注入。 JSF有很好的@ManagedProperty。你可以閱讀更多關於它here

編輯

現在看到你不想使用Session這使我想起另一種解決方案是:

@ManagedBean 
@ViewScoped 
public class Bean1 implements Constants{ 
    private List<SelectItem> countryList; 
    private List<String> choosenCountryList; 
    private List<String> choosenProgramList; 
    private String invoiceDatePriorTo= CalendarUtilities.getTodaysDate() ; 
    private List<CustomResults> searchResultList 

    public getSearchResults(){ 
     // Your code here 
    } 

    public modifySearchResults(){ 
     // Your code here 
    } 
} 

至於你說的問題是,你可以將所有信息從一個請求保存到下一個請求。通常在使用@ApplicationScoped@ViewScoped時會出現這種情況。由於不同的原因,在某些情況下這可能不是最好的解決方案。

對於您的示例,將所有方法放入一個爲@ViewScoped的bean中可能是最佳解決方案。這種方法有其缺點,但我認爲這是一樣好..

Here你可以閱讀更多關於此事。

+0

我不想使用會話範圍..有沒有其他方式來做到這一點。 – Sam 2012-03-07 13:12:14

+0

@Sam我想你可以用不同的方式來解決這個問題。將'getSearchResults()'放在'Bean1'中,並用'@ ViewScoped'註釋這個bean。這樣,只要您不改變視圖,您就可以訪問所有信息。 – Ionut 2012-03-09 09:28:03

+0

@Sam更新了答案。 – Ionut 2012-03-09 09:36:51