2011-09-12 45 views
10

Cách hiệu quả nhất để thực hiện phân trang trong ứng dụng JSF 2.0 là gì? Tôi sử dụng Primefaces datatable và nó là đủ thông minh để thực hiện phân trang của chính nó mà không có mã hóa ở tất cả.Phân trang JSF hiệu quả

<p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10"> 
    <!-- Multiple columns here--> 
</p:dataTable> 

Điều tôi thấy, là tôi cần đặt bean của mình lên phiên có phạm vi trở lên.

@ManagedBean 
@SessionScoped 
public class CarBean{ 
    public List<Car> getCars(){ 
     //return data from DB 
    } 
} 

Tôi muốn biết có cách nào hiệu quả hơn về cách thực hiện việc này không?

Tôi đã sử dụng EJB/JPA ở chương trình phụ trợ bằng cách này. Muốn biết bất kỳ liên kết hoặc hướng dẫn nào để tìm hiểu thêm về điều này.

Cảm ơn.

Trả lời

18

Bạn cần phải sử dụng LazyDataModel để có chỉ các hàng trong bộ nhớ mà khách hàng thực sự cần để xem . See also the example in PrimeFaces showcase. Điều này thực hiện phân trang ở cấp DB, đó là điều bạn mong muốn cuối cùng.

RichFaces được hỗ trợ theo cách tương tự về hương vị của ArrangableDataModel, here's the RichFaces showcase example.

+0

Xin chào BalusC, đây là một gợi ý tuyệt vời. Tôi sẽ sử dụng cái này. Tuy nhiên, tôi nhận thấy rằng mô hình này là nguyên tố cụ thể. Chỉ muốn biết, điều gì sẽ xảy ra nếu tôi đang sử dụng JSF chỉ có thể định dạng, sau đó phân trang được thực hiện như thế nào trong trường hợp này? Xin lỗi cho câu hỏi thêm, nó chỉ làm tăng sự tò mò của tôi. Tôi có một EJB/JPA xử lý logic nghiệp vụ của tôi. –

+0

Bạn sẽ chỉ cần viết mã boilerplate cần thiết trong một số bean trợ giúp. Bạn có thể nhận được một số ví dụ điển hình/thông tin chi tiết trong bài viết này: http://balusc.blogspot.com/2008/10/effective-datatable-paging-and-sorting.html (lưu ý: bài viết 3 tuổi và JSF 1.2 được nhắm mục tiêu!) – BalusC

+0

@ BalusC, thực sự. Tất cả các boilerplate trong một số hạt trợ giúp. Tại sao JSF phải rất chung chung? Và tại sao JSF được xây dựng trong dataTable thành phần thiếu một cái gì đó như 'LazyDataModel' sau 10 năm tồn tại của nó? –

1

Tôi đã nhận thấy rằng tính năng phân trang được xây dựng trong bảng dữ liệu Primefaces là một trong những tính năng tốt nhất và đã thực hiện một số lượng tải thử nghiệm tốt, mang lại các bản ghi với hơn 30.000 thực thể Hibernate và thấy hiệu suất mờ nhạt . Điều này tất nhiên có nghĩa là bạn sẽ có 30.000 thực thể trong phiên vì vậy tôi có những điều sau đây trong web.xml của tôi để giúp đỡ bằng cách lưu trữ phiên ở phía máy chủ.

<context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

Điều này sẽ giảm kích thước của ViewState cho phép yêu cầu/kích thước phản hồi giảm đáng kể tuy nhiên bộ nhớ phía máy chủ có thể bị ảnh hưởng rất lớn.

Một tùy chọn tiềm năng khác trong một số triển khai JSF để giúp giảm thiểu kích thước của ViewStat hoặc sử dụng bộ nhớ phiên là nén. Liên kết sau mô tả một số tham số cấu hình SUN RI và MyFaces JSF có thể được thiết lập, một số trong đó cung cấp tùy chọn nén trạng thái phiên. http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html

Theo như tìm hiểu thêm về cách tính năng phân trang cú pháp của Thủ tướng Chính phủ hoạt động, tại sao không đi thẳng đến nguồn? Primefaces là sau khi tất cả một dự án mã nguồn mở, vì vậy chỉ cần nhìn vào mã và xem những gì bạn có thể học: http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces

0

Lưu ý quan trọng tùy thuộc vào phiên bản Primefaces bạn đang sử dụng. Bắt đầu với 3.0.M2 (tôi nghĩ) nếu bạn muốn sử dụng tính năng chọn hàng, bạn phải triển khai SelectableDataModel. Điều này phá vỡ rất nhiều mã di sản và có một số bitches về điều đó.

điều dễ nhất để làm là để tạo ra một lớp bên trong như thế này:

private MyDataModel dataModel = null; 

public MyDataModel getDataModel() { 
    if (dataModel != null) return dataModel; 
    dataModel = new MyDataModel(some list); 
    return dataModel; 
} 

public static class MyDataModel extends ListDataModel<SomeRecord> 
     implements SelectableDataModel<SomeRecord> { 

    MyDataModel(List<SomeRecord> source) { 
     super(source); 
    } 
etc. 

Sau đó, giá trị thuộc tính để p: DataTable trở thành # {} bean.dataModel.

Chúc may mắn.

2

Trong ứng dụng sản xuất, chúng tôi đã sử dụng mô hình dữ liệu lười để xử lý 700.000 bản ghi trong db. Tôi muốn đề nghị sử dụng M3 trong đó có sửa chữa trên lười biếng datatable trường hợp.

Các vấn đề liên quan