在顯示標籤,我用分頁功能,當我想看到的15排列表中,但featch全部來自數據庫的行顯示標籤。每次當我點擊分頁編號時,它會捕捉db.bcoz中的所有行,這會減慢應用程序的性能。顯示標籤分頁問題
我希望在顯示標記,當我想看到15行然後顯示標記也從數據庫獲取15行不是整個數據庫行。如果有人知道,Plz幫助我。
在顯示標籤,我用分頁功能,當我想看到的15排列表中,但featch全部來自數據庫的行顯示標籤。每次當我點擊分頁編號時,它會捕捉db.bcoz中的所有行,這會減慢應用程序的性能。顯示標籤分頁問題
我希望在顯示標記,當我想看到15行然後顯示標記也從數據庫獲取15行不是整個數據庫行。如果有人知道,Plz幫助我。
你必須使用外部分頁功能。首先,在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;
}
Displaytag使用以「d-」開頭的參數發送它的分頁和排序數據。 因此,快速解決方案可以檢查請求中是否包含以「d - 」開頭的內容,如果是,則不要再次執行查詢。
由於某種原因,使用PaginatedList
似乎並不奏效。我嘗試了最新版本,它似乎有一些錯誤,即使我硬編碼的大小值,它會給出錯誤attribute size must be specified
。我經歷了其他鏈接/博客,許多人都指出了這一點。
我最終使用的選項是將數據存儲在會話中。當用戶點擊下一個時,它會檢查會話中的數據。如果存在,它不會觸及服務層。到目前爲止,它工作得很好。
在哪裏檢查? – Sayan 2013-01-29 14:19:18