JSF - 更新Controller Bean中的模型值

时间:2010-05-26 14:29:42

标签: jsf

我有一个Controller bean(SearchController),它有两个托管bean作为托管属性(SearchCriteria,SearchResults;两者都是会话作用域)。

当用户点击查找按钮时,执行的操作方法在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));
}   
}

1 个答案:

答案 0 :(得分: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}访问搜索结果,并且您希望覆盖SearchResults内的SearchController属性替换当前的会话作用域托管bean。

这是错误的。

您需要使用#{searchController.searchResults.someData}代替

来解决此问题
<h:outputText value="#{searchController.searchResults.someData}" />

或者覆盖(设置)SearchResults属性,而不是覆盖SearchController的整个托管属性:

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

或者通过在会话中手动替换bean(不推荐)。

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