Мой вопрос касается наилучшей практики, как реализовать разбиение на страницы для набора результатов (например, результата SQL) в приложении JSF?
Результирующие наборы данных обычно реализуются компонентом @RequestScoped, как в следующем коротком примере:
@Named
@RequestScoped
public class DataBean {
private List<Item> items;
@EJB
private ItemService itemService;
@PostConstruct
public void init() {
items = itemService.list();
}
public List<Item> getItems() {
return items;
}
}
Таким образом, набор результатов вычисляется только один раз для жизненного цикла компонента.Смотрите также это обсуждение: Как и когда я должен загрузить модель из базы данных для h: dataTable
Теперь, как выполнить разбиение на страницы, если вы хотите показать только подмножество данных - например,10 записей за раз.Для этого вам нужен - для моего понимания - объект ViewScoped или ConversationScoped, содержащий текущий индекс страницы, выбранный пользователем.
@Named
@ConversationScoped
public class PageController implements Serializable {
private int pageIndex = 0;
@PostConstruct
protected void init() {
if (conversation.isTransient()) {
conversation.begin();
}
}
public void next() {
pageIndex++;
}
public void back() {
pageIndex--;
if (pageIndex < 0) {
pageIndex = 0;
}
}
public int getPageIndex() {
return pageIndex;
}
}
Мой вопрос: как я могу предоставить моему DataBean информацию pageIndex из моего PageController.Или, если быть более точным, какова лучшая практика?Я хочу избежать реализации DataBean ViewScoped, потому что я не хочу сохранять результаты данных в сеансе сервера.
Мое единственное решение до сих пор состоит в том, чтобы загрузить данные в viewAction и предоставить pageController параметр метода:
<f:metadata>
<f:viewAction action="#{dataBean.loadData(pageController)}" />
</f:metadata>