JSF - 在构造函数中加载UISelectItem列表

时间:2011-01-12 18:41:58

标签: java jsf jsf-2 primefaces

我正在使用JSF2.0和Primefaces 2.2RC2运行应用程序

我在我的项目上运行了探查器,并确定UISelectItems列表中存在瓶颈。对于我的应用程序中的每个操作,列表被填充了6次。

UISelectItem列表正在一个名为getCountryList()的getter方法中填充,它看起来像这样

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次。

然后我尝试将List的创建移动到一个在@PostContruct上调用的方法但是当我这样做时,列表在我使用时不会显示

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

它只是显示为空。有没有人知道如何正确创建一个列表,因此它只创建一次,并且可以在整个用户会话中调用以填充下拉列表?

2 个答案:

答案 0 :(得分:2)

在类的字段中列出列表,在@postconstruct中初始化它,在get方法中检查它的null是否创建它并返回它,否则返回它,

答案 1 :(得分:2)

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(),因为这样做更有意义)

另见: