Поле со списком статических данных в компоненте JSF Request Scope?

На экране, отображаемом реализацией JSF, мне нужно было показать статический раскрывающийся список или поле со списком (что означает, что значения не меняются), поэтому я решил использовать список выбранных элементов и в получателе списка, Я заполняю все выбранные элементы как это

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

Если бы я использовал этот способ - Какие подводные камни? Я сделал этот список статическим, поскольку он будет общим для всех Bean-компонентов с областью запроса, создаваемых реализацией JSF. Это нормально делать?

Иногда элементы добавляются дважды, если выполняется несколько запросов. Существует ли область применения? или Каков стандартный способ делать эти вещи?

Я также изучаю API. Иногда SO быстрее.

Я использую JSF Apace My Faces 1.2 без Tomahawk или каких-либо дополнительных библиотек.

Спасибо,


jsf
person gekrish    schedule 29.06.2010    source источник


Ответы (1)


Иногда элементы добавляются дважды, если запущено несколько запросов.

Это указывает на то, что вы добавляете элементы в метод получения, как показано ниже.

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 должна быть единственная цель - вернуть свойство 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"));
    }
}

or @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 с областью действия приложения - это путь.

Смотрите также:

person BalusC    schedule 29.06.2010
comment
Это указывает на то, что вы добавляете элементы в метод getter или используете bean-компонент с областью действия сеанса и очищаете/конструируете список только во время объявления свойства или создания bean-компонента. Это не хорошо. Вы должны создать и заполнить список во время создания bean-компонента или инициализации или @PostConstruct. -- Вышеприведенные утверждения не противоречивы ? Я не понимаю!!! - person gekrish; 29.06.2010
comment
Привет BalusC, Вы хотели сказать сделать это в конструкторе? - person gekrish; 29.06.2010
comment
Кроме того, я также могу ‹f:selectItems value=${somebean.someList}, что не будет снова устанавливать значения в bean-компоненте. - person gekrish; 29.06.2010