Sau đây là cách tôi sẽ thực hiện nó: Nó thường là một ý tưởng tốt để tạo ra một lớp lọc để lọc dữ liệu và chứa thông tin liên quan pagination cho bạn. Tôi sử dụng một cái gì đó như thế này:
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();
}
}
Bạn có thể có các lớp con đặc biệt của bộ lọc (tùy thuộc vào những gì bạn muốn lấy) và và mỗi lớp sẽ thực hiện nó là createCountQuery()
và createQuery()
.
Bạn sẽ đặt Filter
vào ngữ cảnh Velocity
và bạn có thể truy xuất tất cả thông tin bạn cần từ lớp này.
Khi bạn đặt khóa trang hiện tại, bạn cập nhật tất cả thông tin khác mà bạn cần (tức là currentStartPageNo, currentEndPageNo).
Bạn cũng có thể có phương thức refresh()
để đặt bộ lọc trở về trạng thái ban đầu.
Và tất nhiên bạn nên giữ trường hợp của cùng một bộ lọc trong phiên (tôi có nghĩa là khung web của bạn như Struts, Turbine, v.v.) trong khi người dùng điều hướng trên trang tìm kiếm mà thuộc tính Filter
.
Đây chỉ là một hướng dẫn, một ý tưởng, nó không phải là mã thực thi hoàn toàn bằng văn bản, chỉ là một ví dụ để giúp bạn bắt đầu theo một hướng.
Tôi cũng sẽ giới thiệu cho bạn một plugin jQuery có tên là jqGrid có hỗ trợ phân trang (mặc dù bạn phải có một bản sao lưu để truy xuất dữ liệu) và nhiều thứ thú vị hơn. Bạn có thể sử dụng nó để hiển thị dữ liệu của bạn trong một mạng lưới. Tôi sử dụng nó cùng với Velocity
mà không có vấn đề gì. Nó có rất nhiều tính năng rất đẹp và hữu ích như thanh công cụ lọc, các ô có thể chỉnh sửa, chuyển dữ liệu trong JSON
, XML
vv. Thành thật mà nói, tôi không biết liệu nó có phân trang như bạn cần hay không (tôi sử dụng nó chỉ với một trang được hiển thị trong điều hướng và bạn không thể bấm vào một trang chỉ cần sử dụng một nút prev kế tiếp để điều hướng), nhưng nó có thể có hỗ trợ cho điều đó.
Tôi đã làm điều này trước đây. Nó sẽ giúp để xem mã của bạn mặc dù ... – Alex
Cách nó được mã hóa ngay bây giờ là $ searchTO.getPagination() getDirectPageLinks() nhận được tất cả các liên kết đến các trang. nếu tôi có 50 trang thì nó hiển thị tất cả – pushya
Bạn đang sử dụng khung công tác kiên trì nào? – Atticus