有时,如果触发多个请求,则会添加两次项目。
这表明您正在 getter 方法中添加项目,如下所示
public class Bean {
private List<SelectItem> items = new ArrayList<SelectItem>();
public List<SelectItem> getItems() {
items.add(new SelectItem("value1", "label1"));
items.add(new SelectItem("value2", "label2"));
items.add(new SelectItem("value3", "label3"));
return items;
}
}
这不好。 javabean getter 的唯一目的应该是返回一个 bean 属性或最多执行延迟加载,而不是做一些业务。您应该在 bean 构建期间创建并填写列表
public class Bean {
private List<SelectItem> items;
public Bean() {
items = new ArrayList<SelectItem>();
items.add(new SelectItem("value1", "label1"));
items.add(new SelectItem("value2", "label2"));
items.add(new SelectItem("value3", "label3"));
}
}
或初始化
public class Bean {
private List<SelectItem> items;
{
items = new ArrayList<SelectItem>();
items.add(new SelectItem("value1", "label1"));
items.add(new SelectItem("value2", "label2"));
items.add(new SelectItem("value3", "label3"));
}
}
或@PostConstruct
public class Bean {
private List<SelectItem> items;
@PostConstruct
public void init() {
items = new ArrayList<SelectItem>();
items.add(new SelectItem("value1", "label1"));
items.add(new SelectItem("value2", "label2"));
items.add(new SelectItem("value3", "label3"));
}
}
有应用范围吗?
有。只需使用<managed-bean-scope>application</managed-bean-scope>。
或者做这些事情的标准方法是什么?
应用程序范围的 bean 是要走的路。
另见: