【问题标题】:A List box of static data in JSF Request scoped Bean?JSF 请求范围 Bean 中的静态数据列表框?
【发布时间】:2010-06-29 12:40:24
【问题描述】:

在由 JSF 实现呈现的屏幕中,我必须显示一个静态下拉列表或列表框(这意味着值不会改变),所以我决定使用选择项列表并在列表,我将所有选择的项目都填充为这个

List.add(new SelectItem(VALUE,TEXT)) and so on.. 

如果我使用这种方式 - 有什么陷阱?我将此列表设为静态,因为这对于 JSF 实现创建的所有请求范围 Bean 来说都是通用的。这样做可以吗?

有时,如果触发多个请求,项目会添加两次。是否有应用程序范围?或者做这些事情的标准方法是什么?

我也在研究 API。有时 SO 更快。

我正在使用没有 Tomahawk 或任何额外库的 JSF Apace My Faces 1.2

谢谢,

【问题讨论】:

    标签: jsf


    【解决方案1】:

    有时,如果触发多个请求,则会添加两次项目。

    这表明您正在 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"));
        }
    }
    

    有应用范围吗?

    有。只需使用&lt;managed-bean-scope&gt;application&lt;/managed-bean-scope&gt;

    或者做这些事情的标准方法是什么?

    应用程序范围的 bean 是要走的路。

    另见:

    【讨论】:

    • 这表明您正在 getter 方法中添加项目或正在使用会话范围的 bean,并且仅在属性声明或 bean 构造期间清除/构造列表。不是很好。您应该在 bean 构造或初始化或 @PostConstruct 期间创建并填充列表。 ——以上说法不矛盾吗?我不明白!!!
    • 嗨 BalusC,您的意思是说要在构造函数中执行此操作吗?
    • 此外,我还可以
    猜你喜欢
    • 2011-11-11
    • 2011-08-15
    • 1970-01-01
    • 2011-10-17
    • 2011-09-02
    • 2014-12-02
    • 2018-10-08
    • 2012-11-01
    • 2013-01-21
    相关资源
    最近更新 更多