Как и когда я должен загрузить модель из базы данных для h:dataTable

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

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

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

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

1 ответ

Решение

Сделай это в бобах @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,

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

Другие вопросы по тегам