Pagination là trong thực tế dễ dàng. Bạn chỉ cần tiếp tục truyền một hoặc hai tham số xung quanh: firstrow
và tùy chọn rowcount
(cũng có thể được giữ ở phía máy chủ). Khi người dùng cuối nhấp vào Tiếp theo, bạn chỉ cần tăng giá trị firstrow
với giá trị là rowcount
. Khi người dùng cuối nhấp vào Quay lại, bạn chỉ cần giảm giá trị của firstrow
với giá trị là rowcount
. Bạn chỉ cần kiểm tra xem nó có vượt quá biên giới của 0
và totalrows
và thay đổi tương ứng hay không.
Sau đó, dựa trên mong muốn firstrow
và rowcount
, bạn biết chính xác dữ liệu sẽ hiển thị. Nếu tất cả dữ liệu đã có trong một số List
trong bộ nhớ của Java, thì bạn chỉ cần sử dụng List#subList()
để lấy danh sách con từ nó để hiển thị. Tuy nhiên nó không hiệu quả để sao chép toàn bộ bảng cơ sở dữ liệu vào bộ nhớ của Java. Nó có thể không gây hại khi nó chỉ có 100 hàng, nhưng khi nó nhiều hơn thế và/hoặc bạn đang sao chép nó cho mỗi người dùng duy nhất, sau đó ứng dụng sẽ hết bộ nhớ rất sớm.
Trong trường hợp đó, bạn muốn phân trang ở cấp DB. Trong ví dụ MySQL bạn có thể sử dụng mệnh đề LIMIT
để có được một tập con của các kết quả từ DB. JPA/Hibernate thậm chí còn cung cấp các cách sử dụng các phương thức setFirstResult()
và setMaxResults()
tương ứng là Query
và Criteria
. Bạn có thể tìm thấy các ví dụ trong câu trả lời this và this.
Bạn có thể tìm thấy ví dụ khởi động JSF 1.2 cơ bản được nhắm mục tiêu theo phân trang giống như Google (và sắp xếp) trong this article. Nó sử dụng các thành phần Tomahawk, nhưng trong JSF 2.0 bạn chỉ có thể để chúng đi bằng cách làm cho bean @ViewScoped
(thay thế t:saveState
) và sử dụng ui:repeat
(thay thế t:dataList
).
Cuối cùng nhưng không kém phần quan trọng, có rất nhiều thư viện thành phần thực hiện tất cả các công việc trong một thành phần. Ví dụ: RichFaces<rich:datascroller>
và PrimeFaces<p:dataTable paginator="true">
(cũng có thể được thực hiện ajaxical).
Bạn có sử dụng các richfaces trong ứng dụng của mình không? –
Tôi thì không. Nhưng tôi có thể nếu điều đó giúp tôi :-) – Sven