2010-05-26 24 views
1

我有一個Controller bean(SearchController),它有兩個託管bean作爲託管屬性(SearchCriteria,SearchResults;它們都是會話作用域)。JSF - 更新控制器Bean中的模型值

當用戶點擊查找按鈕時,執行的操作方法位於SearchController中。

SearchCreteria託管bean有一個名爲search()的方法。此方法返回一個新的SearchResults對象。在控制器bean中,我將searchResults託管屬性設置爲這個新的SearchResults對象。 searchResults對象包含我在該請求期間所期望的內容,但該對象不會保留在託管bean中。

據我所知,我正在改變searchResults引用的對象,但我不明白的是爲什麼JSF沒有更新模型來使用新對象。任何想法,我失蹤或不明白?我在WebSphere 6.1上使用JSF 1.1。

如果我把SearchResults託管bean的搜索方法,它的工作原理。

註釋掉的SearchController.find()中的行是當前工作的行。

public class SearchController { 

SearchCriteria searchCriteria; 
SearchResults searchResults; 
ResultsBacking resultsBacking; 


public String find() 
{ 

    setSearchResults(searchCriteria.search()); 
//  searchResults.findSearchResults(searchCriteria); 

    if (!searchResults.resultsFound()) 
    { 
     return "noresults"; 
    } 

    return "success"; 
} 


public class SearchCriteria { 

public SearchResults search() 
{ 
    SearchDAO sdao = new SearchDAO(); 
    ArrayList<Group> list = (ArrayList<Group>)sdao.findGroups(this); 

    SearchResults searchResults = new SearchResults(); 
    searchResults.setSearchResults(list); 
    return searchResults; 
} 

} 


public class SearchResults { 

List<Group> searchResults; 

public void findSearchResults(SearchCriteria criteria) 
{ 
    SearchDAO sdao = new SearchDAO(); 
    this.setSearchResults(sdao.findGroups(criteria)); 
} 
} 
+2

這真的很難,幫助沒有看到有問題的代碼... – kgrad 2010-05-26 14:32:07

+0

我同意,這是很難想象的問題,而一些片段。檢查我的答案,我發佈了一個示例代碼片段。看看是否屬實。 – BalusC 2010-05-26 14:47:59

回答

2

在堅果,你是這樣的:

@ManagedBean 
public class SearchController { 

    @ManagedProperty(value="#{searchCriteria}") 
    private SearchCriteria searchCriteria; 

    @ManagedProperty(value="#{searchResults}") 
    private SearchResults searchResults; 

    public void find() { 
     searchResults = searchCriteria.search(); 
    } 

} 

並在視圖中#{searchResults}不包含預期的效果?

這聽起來就好像你被#{searchResults.someData}而不是#{searchController.searchResults.someData}訪問搜索結果和你期待的是重寫SearchControllerSearchResults屬性將取代目前的會話範圍的託管bean。

這是錯誤的。

您需要通過或者使用#{searchController.searchResults.someData}代替

<h:outputText value="#{searchController.searchResults.someData}" /> 

或者通過重載(設置)屬性SearchResults而不是壓倒一切的SearchController全託管屬性來解決這個問題:

public void find() { 
     searchResults.setSomeData(searchCriteria.search().getSomeData()); 
    } 

或者通過手動替換session中的bean(不推薦)。

public void find() { 
     searchResults = searchCriteria.search(); 
     FacesContext.getCurrentInstance().getExternalContext() 
      .getSessionMap().put("searchResults", searchResults); 
    } 
+0

感謝BalusC,我已經設置了SearchResults的屬性,並且做了訣竅。 在你列出的3種中,你通常在這些情況下使用哪一種? – Sean 2010-05-26 14:55:58

+0

取決於上下文和要求。它可以是第一或第二,但通常不是第三。如果'SearchResults'確實需要一個**獨立的託管bean,那麼我會爭取第二個。但是,如果**無法在任何視圖中沒有SearchController的情況下繼續存在,那麼我會先查找並停止將SearchResults作爲託管bean。 – BalusC 2010-05-26 15:02:57

相關問題