2010-10-08 46 views
6

Trong thẻ hiển thị tôi đã sử dụng tính năng phân trang, khi tôi muốn xem danh sách 15 hàng nhưng thẻ hiển thị sẽ hiển thị tất cả các hàng từ cơ sở dữ liệu. mỗi khi tôi nhấp vào số pagination, nó sẽ làm cho tất cả các hàng từ db.bcoz của nó làm chậm hiệu suất của ứng dụng.Sự cố phân trang thẻ hiển thị

Tôi muốn trong thẻ hiển thị khi tôi muốn xem 15 hàng thì thẻ hiển thị cũng tìm nạp 15 hàng từ db không phải toàn bộ hàng db. Plz giúp tôi nếu một số người biết.

Trả lời

10

Bạn phải sử dụng tính năng phân trang bên ngoài. Đầu tiên, chỉ định trong thẻ html mà bạn đang sử dụng phân trang bên ngoài. Và tạo một đối tượng triển khai org.displaytag.pagination.PaginatedList. Cuối cùng, bạn phải thực hiện DAO mà thực sự truy vấn cho 15 hàng chỉ và trả về PaginatedList.

1) jsp của bạn sẽ trông như thế này

<display:table name="command" sort="external" partialList="true" size="${command.fullListSize}" pagesize="${command.objectsPerPage}"> 
    <display:column property="name" title="name"/> 
    ... 
</display:table> 

Lưu ý rằng nó quy định các loại là bên ngoài.

2) triển khai org.displaytag.pagination.PaginatedList.

public class PaginatedListImpl<T> implements PaginatedList{ 
    private int fullListSize; 
    private int objectsPerPage; 
    private int pageNumber; 
    private String searchId; 
    private String sortCriterion; 
    private SortOrderEnum sortDirection; 
    private List<T> list; 

//getters and setters 
... 
} 

3) DAO Mẫu triển khai sử dụng ngủ đông. Bạn có thể làm điều đó với JDBC hoặc bất cứ điều gì nhưng chắc chắn rằng bạn đang làm cho các truy vấn đúng để có được 15 hàng theo thứ tự thích hợp và trả về đối tượng PaginatedListImpl.

@SuppressWarnings("unchecked") 
public PaginatedListImpl<T> getPaginatedList(PaginatedListImpl paginatedList) { 
    int pageNum = paginatedList.getPageNumber(); 

    final int objectsPerPage = paginatedList.getObjectsPerPage(); 
    final int firstResult = objectsPerPage * pageNum; 
    String sortOrderCriterion = pagiantedList.getSortOrderCriterion(); 
    String sortOrder = paginatedList.getSortOrder 

    String className = type.getName().substring(type.getName().lastIndexOf(".") + 1); 
    final StringBuilder fromClause = new StringBuilder("from " + className + " " + alias); 
    String orderByClause = new StringBuilder(" order by ").append(sortCriterion).append(" ").append(sortDirection); 

    final String hql = new StringBuilder().append(fromClause).append(orderClause).toString(); 
    List<T> resultList = getHibernateTemplate().executeFind(new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException, SQLException { 
    return session.createQuery(hql) 
     .setFirstResult(firstResult) 
     .setMaxResults(objectsPerPage) 
     .list(); 
    } 
    }); 
    Long count = (Long)getHibernateTemplate().execute(new HibernateCallback() {   
    public Object doInHibernate(Session session) throws HibernateException, SQLException { 
     return session.createQuery("select count(*) " + fromClause).uniqueResult(); 
    } 
    }); 
    paginatedList.setFullListSize(count.intValue()); 
    paginatedList.setList(resultList); 
    paginatedList.setPageNumber(pageNum+1); 
    paginatedList.setObjectsPerPage(objectsPerPage); 
    return paginatedList; 
} 
2

Thẻ hiển thị sẽ gửi dữ liệu phân trang và phân trang bằng thông số bắt đầu bằng “d-”. Vì vậy, giải pháp nhanh chóng có thể được kiểm tra nếu yêu cầu có chứa một cái gì đó bắt đầu bằng "d -", nếu có thì không thực hiện truy vấn của bạn một lần nữa.

+0

nơi để kiểm tra điều này? – Sayan

0

Vì một số lý do, sử dụng PaginatedList dường như không hoạt động. Tôi đã thử với phiên bản mới nhất và có vẻ như có một số lỗi và nó cung cấp cho các lỗi attribute size must be specified ngay cả khi tôi mã cứng giá trị kích thước. Tôi đã đi qua các liên kết/blog khác và nhiều người đã chỉ ra điều này.

Tùy chọn mà cuối cùng tôi đã sử dụng là lưu trữ dữ liệu trong phiên. Khi người dùng nhấp vào tiếp theo, nó sẽ kiểm tra dữ liệu trong phiên. Nếu có, nó sẽ không chạm vào lớp dịch vụ. Cho đến nay nó đã làm việc tốt.

+0

Có vẻ như bạn là người đăng ban đầu - có lẽ bạn đã đăng ký ngay bây giờ. Nếu vậy, bạn có thể làm rõ. Nếu không, vui lòng chỉnh sửa để nói "dường như không hoạt động" thay vì "dường như không hoạt động". – AndrewC

+0

Nó có thể là danh sách kết quả của bạn là null. – Alex

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