JSF - загрузка списка UISelectItem в конструктор - PullRequest
1 голос
/ 12 января 2011

Я запускаю приложение, используя JSF2.0 и Primefaces 2.2RC2

Я запустил профилировщик в своем проекте и определил, что в списке UISelectItems было узкое место. Список заполнялся примерно 6 раз на каждое действие в моем приложении.

Список UISelectItem заполнялся в методе получения, называемом getCountryList (), и выглядел он так

public UISelectItems getCountryList() throws Exception {
    Collection List = new ArrayList();
    List<Countries> c_list = myDao.getCountryList();

    for( QcardCountries c : c_list ) {
       list.add(new SelectItem(c.getCountryId().toString(), c.getCountryName());
    }

    UISelectItems countries = new UISelectItems();
    countries.setValue(list);
    return countries;
}

Это работает, когда я вызываю в представлениях, как это так

<f:selectItems binding="#{myBean.countryList}" />

но снова он вызывается примерно 6 раз для каждой кнопки или действия, которое я выполняю в приложении.

Затем я попытался переместить создание списка в метод, который был вызван в @PostContruct, но когда я это сделал, список не отображается, когда я использую

 <f:selectItems binding="#{myBean.countryList}" /> 

Это просто выглядит как пустое. Кто-нибудь знает, как правильно создать список, чтобы он создавался только один раз, и его можно вызывать на протяжении всего сеанса пользователя для заполнения раскрывающегося списка?

Ответы [ 2 ]

2 голосов
/ 12 января 2011

org.life.java уже дал подсказку о загрузке, но поскольку вы без необходимости используете binding, а JSF 2.0 предоставляет способ просто принять List<SomeBean> вместо List<SelectItem> в качестве значения, вот полный пример того, как сделать это правильно:

private List<Country> countries;

@PostConstruct
public void init() {
    countries = myDao.getCountryList();
}

public List<Country> getCountries() {
    return countries;
}

с

<f:selectItems value="#{bean.countries}" var="country" itemValue="#{country.id}" itemLabel="#{country.name}" />

(обратите внимание, что я переименовал модель Countries в Country и getCountryId() в getId() и getCountryName() в getName(), поскольку это имеет больше смысла)

Смотри также:

2 голосов
/ 12 января 2011

взять список в поле класса, инициализировать его в @postconstruct, в методе get проверить, создаст ли его нулевое значение, и вернуть его или же вернуть,

...