我正在使用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}" />
它只是显示为空。有没有人知道如何正确创建一个列表,因此它只创建一次,并且可以在整个用户会话中调用以填充下拉列表?
答案 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()
,因为这样做更有意义)