2010-05-26 3 views
1

У меня есть компонент Controller (SearchController), который имеет два управляемых компонента в качестве управляемых свойств (SearchCriteria, SearchResults, оба из которых относятся к сеансу).JSF - Обновление значений модели в контроллере Bean

Когда пользователь нажимает кнопку поиска, метод действия, который выполняется, находится в SearchController.

У управляемого компонента SearchCreteria есть метод под названием search(). Этот метод возвращает новый объект SearchResults. В контроллере bean я устанавливаю свойство searchResults для управления этим новым объектом SearchResults. Объект searchResults содержит то, что я ожидаю во время этого запроса, но объект не сохраняется в управляемом компоненте.

Я понимаю, что я меняю объект, на который ссылаются поисковые запросы, но я не понимаю, почему JSF не обновляет модель для использования нового объекта. Любые идеи, что мне не хватает или не понимаю? Я использую JSF 1.1 в WebSphere 6.1.

Если я поместил метод поиска в управляемый компонент SearchResults, он будет работать.

Линия в 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

+0

Я согласен, что трудно представить себе проблему без каких-либо фрагментов. Проверьте мой ответ, я опубликовал фрагмент примера. Посмотрите, правда ли это. – BalusC

ответ

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 замените текущий сеанс контекстного управляемым компонент.

Это неправильно.

Вы должны решить либо с помощью #{searchController.searchResults.someData} вместо

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

Или по переопределение (настройки) свойства из SearchResults вместо перекрывая весь управляемый свойство SearchController:

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

Или вручную заменив компонент в сеансе (не рекомендуется).

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

спасибо BalusC, я установил свойства SearchResults и сделал трюк. Из 3 вы указали, какой из них вы обычно используете в этих ситуациях? – Sean

+0

Зависит от контекста и требований. Это либо первый, либо второй, но обычно не третий. Если 'SearchResults' действительно должен быть ** независимым ** управляемым компонентом, тогда я бы пошел на второй. Но если он ** не может ** выжить без «SearchController» в любом представлении, я бы пошел первым и остановил «SearchResults» как управляемый компонент. – BalusC

Смежные вопросы