在一个由JSF实现呈现的屏幕中,我必须显示一个静态下拉列表或列表框(这意味着值没有改变),所以我决定使用一个选择项列表并在getter中列表,我正在填充所有选择的项目
List.add(new SelectItem(VALUE,TEXT)) and so on..
如果我用这种方式 - 有什么陷阱?我将此List设置为静态,因为这对于JSF实现创建的所有Request Scoped Beans来说都很常见。这可以吗?
有时,如果多个请求被触发,则会将项目添加两次。是否有应用程序范围?或者什么是做这些东西的标准方式?
我也在研究API。有时候SO更快。
我正在使用没有Tomahawk的JSF Apace My Faces 1.2或任何额外的库
谢谢,
答案 0 :(得分:2)
有时,如果多个请求被触发,则会将项目添加两次。
这表示您正在添加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是可行的方法。