我有一个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));
}
}
答案 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);
}