Доступ к значениям управляемого компонента JSF в другом управляемом компоненте - PullRequest
7 голосов
/ 07 марта 2012

У меня есть страница создания отчета, где у меня есть несколько фильтров, таких как countryId, Date и несколько других параметров, которые пользователь может выбрать.Теперь, основываясь на выбранных параметрах, есть вызов базы данных, который использует эти параметры для извлечения списка результатов.

Теперь управляемый компонент содержит все эти параметры поиска и список результатов. Давайте назовем этот компонент как * 1005.*

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 находится в области запроса.

Может кто-нибудь сказать мне, как поступить и решить эту проблему?

Ответы [ 3 ]

11 голосов
/ 07 марта 2012

Просто объявите ваш dataBean как ManagedProperty.

Из тегов я предполагаю, что речь идет о JSF2.0.

Вам необходимо объявить bean1 как управляемое свойство в bean2.

Это должно выглядеть как

@ManagedBean
public class Bean1{
}

и

@ManagedBean
public class Bean2{

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

}

См. Также

4 голосов
/ 07 марта 2012

Ну, ты сказал это сам. Вы должны переместить боб из RequestScope.

В зависимости от вашего приложения вы можете использовать:

  • @SessionScoped
  • @ViewScoped

Здесь вы можете найти статью о выборе правильного объема.

Во-вторых, вы можете использовать Dependency Injection. JSF имеет хороший @ManagedProperty. Подробнее об этом можно прочитать здесь .

EDIT

Теперь, когда вы не хотите использовать 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. Этот подход имеет свои недостатки, но я думаю, что это так же хорошо, как он получает ..

Здесь вы можете прочитать больше об этом вопросе.

0 голосов
/ 17 апреля 2015
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...