Как и когда я должен загрузить модель из базы данных для h:dataTable
У меня есть таблица данных, как показано ниже:
<h:dataTable value="#{bean.items}" var="item">
Я хотел бы заполнить его коллекцией из базы данных, полученной с помощью служебного метода, чтобы она немедленно отображалась при открытии страницы во время начального (GET) запроса. Когда я должен вызвать метод обслуживания? И почему?
- Позвоните до загрузки страницы. Но как?
- Звоните во время загрузки страницы. Как?
- Вызовите это в методе получения. Но это называется несколько раз.
- Что-то другое?
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
,