2010-10-08 82 views
6

在顯示標籤,我用分頁功能,當我想看到的15排列表中,但featch全部來自數據庫的行顯示標籤。每次當我點擊分頁編號時,它會捕捉db.bcoz中的所有行,這會減慢應用程序的性能。顯示標籤分頁問題

我希望在顯示標記,當我想看到15行然後顯示標記也從數據庫獲取15行不是整個數據庫行。如果有人知道,Plz幫助我。

回答

10

你必須使用外部分頁功能。首先,在html標籤中指定您正在使用外部分頁。並創建一個對象實現org.displaytag.pagination.PaginatedList。最後,你必須實現DAO,它實際上只查詢15行,並返回PaginatedList。

1)你的JSP看起來就像這樣

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

注意,它指定的排序是外部的。

2)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使用hibernate實現示例。您可以使用JDBC或其他方法來執行此操作,但請確保按正確的順序進行正確的查詢以獲得15行並返回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

Displaytag使用以「d-」開頭的參數發送它的分頁和排序數據。 因此,快速解決方案可以檢查請求中是否包含以「d - 」開頭的內容,如果是,則不要再次執行查詢。

+0

在哪裏檢查? – Sayan 2013-01-29 14:19:18

0

由於某種原因,使用PaginatedList似乎並不奏效。我嘗試了最新版本,它似乎有一些錯誤,即使我硬編碼的大小值,它會給出錯誤attribute size must be specified。我經歷了其他鏈接/博客,許多人都指出了這一點。

我最終使用的選項是將數據存儲在會話中。當用戶點擊下一個時,它會檢查會話中的數據。如果存在,它不會觸及服務層。到目前爲止,它工作得很好。

+0

這聽起來像你是原始的海報 - 也許你現在註冊了。如果是這樣,你能否澄清。如果沒有,請編輯說「似乎不工作」,而不是「似乎沒有工作」。 – AndrewC 2012-09-19 17:48:31

+0

這可能是你的結果列表爲空。 – Alex 2012-10-15 12:44:02