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

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

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

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

  • Вызовите его перед загрузкой страницы. Но как?
  • Вызовите его во время загрузки страницы. Как?
  • Вызовите его в методе getter. Но он называется несколько раз.
  • Что-то еще?

Ответ 1

Сделайте это в bean @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 определенно будет подходящим местом, поскольку вложенные зависимости не будут доступны внутри обычного конструктора. Более того, при использовании структуры управления bean, которая использует прокси, например CDI @Named, конструктор может или не может быть вызван так, как вы ожидаете. Его можно вызвать несколько раз во время проверки класса, создания прокси и/или создания прокси.

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

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

См. также: