Как и когда я должен загрузить модель из базы данных для h: dataTable - PullRequest
11 голосов
/ 23 апреля 2011

У меня есть таблица данных, как показано ниже:

<h:dataTable value="#{bean.items}" var="item">

Я хотел бы заполнить ее коллекцией из базы данных, полученной с помощью сервисного метода, чтобы она немедленно отображалась при открытии страницыво время начального (GET) запроса.Когда я должен вызвать метод обслуживания?И почему?

  1. Позвоните до загрузки страницы.Но как?
  2. Звоните во время загрузки страницы.Как?
  3. Вызовите его в методе получения.Но это называется несколько раз.
  4. Что-то еще?

1 Ответ

16 голосов
/ 23 апреля 2011

Делайте это по бобовскому методу @PostConstruct.

@ManagedBean
@RequestScoped
public class Bean {

    private List<Item> items;

    @EJB
    private ItemService itemService;

    @PostConstruct
    public void init() {
        items = itemService.list();
    }

    public List<Item> getItems() {
        return items;
    }

}

И пусть value ссылается на свойство (не метод!).

<h:dataTable value="#{bean.items}" var="item">

В @PostConstruct у вас есть преимущество в том, что оно выполняется после конструкция и внедрение зависимостей.Таким образом, в случае, если вы используете EJB для выполнения задачи взаимодействия с БД, @PostConstruct определенно будет правильным местом, поскольку внедренные зависимости еще не будут доступны внутри обычного конструктора.Более того, при использовании инфраструктуры управления компонентами, в которой используются прокси-серверы, такие как CDI @Named, конструктор может или не может быть назван так, как вы ожидаете.Он может вызываться несколько раз во время проверки класса, создания прокси и / или создания прокси.

По крайней мере, не выполняет работу взаимодействия с БД в геттере, если только он не ленивзагрузка, и вы действительно больше ничего не можете сделать.А именно, он будет вызываться во время каждого раунда итерации.Вызов метода службы во время каждого раунда итерации совершенно неэффективен и может привести к «странным» побочным эффектам во время представления и обратной передачи, таким как старые значения из БД, по-видимому, все еще сохраняющиеся в модели вместо новых представленных значений.

Если вы полагаетесь на параметры запроса GET, вместо этого используйте <f:viewParam> и <f:viewAction>.Если вы хотите сохранить модель (свойство items) для постбэков в одном представлении (например, в таблице / диалоге CRUD), тогда создайте компонент @ViewScoped.

См. Также:

...