Вот как я бы это реализовал: как правило, неплохо создать класс Filter, который фильтрует данные и содержит информацию, связанную с разбиением на страницы.Я использую что-то вроде этого:
public abstract class Filter{
/** Member identifier for the current page number */
private int currentPageNo;
/** Member identifier for the current start page number in the page navigation */
private int currentStartPageNo;
/** Member identifier for the current end page number in the page navigation */
private int currentEndPageNo;
/** Member identifier for the number of elements on a page */
private int elementsPerPage;
/** Member identifier for the number of pages you have in the navigation (i.e 2 to 11 or 3 to 12 etc.) */
private int pageNumberInNavigation;
public abstract Query createCountQuery();
public abstract Query createQuery();
public void setCurrentPageNo(){
//Your code here
//Validation, variable setup
}
public Long getAllElementsCount(){
//Now this depends on the presistence framework you use, this code is
//just for guidance and has Hibernate-like syntax
Query query = createCountQuery();
List list = query.list();
return !list.isEmpty() && list.get(0) != null ? query.list().get(0) : 0;
}
public List getElements(){
//Now this depends on the presistence framework you use, this code is
//just for guidance and has Hibernate-like syntax
Query query = createQuery();
int from = ((currentPageNo - 1) * elementsPerPage);
query.setFirstResult(from);
query.setMaxResults(elementsPerPage);
//If you use Hibernate, you don't need to worry for null check since if there are no results then an empty collection is returned
return query.list();
}
public List getAllElements(){
Query query = createQuery();
return query.list();
}
public void refresh(){
//Your code here
}
public List next(){
//Move to the next page if exists
setCurrentPageNo(getCurrentPageNo() + 1);
getElements();
}
public List previoius(){
//Move to the previous page if exists
setCurrentPageNo(getCurrentPageNo() - 1);
getElements();
}
}
У вас могут быть специальные подклассы фильтров (в зависимости от того, что вы хотите получить), и каждый подкласс будет реализовывать это createCountQuery()
и createQuery()
.
Затем вы поместите свой Filter
в контекст Velocity
и сможете извлечь всю необходимую информацию из этого класса.
Когда вы устанавливаете текущую страницу курса, вы обновляете всю другую информацию, котораявам нужно (т.е. currentStartPageNo, currentEndPageNo).
У вас также может быть метод refresh()
для возврата фильтра в исходное состояние.
И, конечно, вы должны сохранять экземпляртот же фильтр в сеансе (я имею в виду ваш веб-фреймворк, такой как Struts, Turbine и т. д.), пока пользователь перемещается по странице поиска, к которой принадлежит Filter
.
Это всего лишь руководство, идея, этоэто не полностью написанный исполняемый код, просто пример, чтобы вы начали в каком-то направлении.
Я бы также порекомендовал вам плагин jQuery с именем jqGrid у него есть поддержка нумерации страниц (хотя для извлечения данных у вас должна быть резервная копия) и много других интересных вещей.Вы можете использовать его для отображения ваших данных в сетке.Я использую его вместе с Velocity
без проблем.Он имеет много очень полезных и полезных функций, таких как панель инструментов фильтра, редактируемые ячейки, передача данных в JSON
, XML
и т. Д. Честно говоря, я не знаю, есть ли у вас нумерация страниц, как вам нужно (я использую только одну страницуотображается в навигации, и вы не можете нажимать на страницу, просто используйте следующие кнопки a a prev для навигации), но она может иметь такую поддержку.