JSF请求范围Bean中的静态数据列表框?

时间:2010-06-29 12:40:25

标签: jsf

在一个由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或任何额外的库

谢谢,

1 个答案:

答案 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是可行的方法。

另见: