display tagで、ページネーション機能を使用しました。15行のリストを表示したいのですが、displaytagはデータベースからすべての行をフェッチします。ページネーション番号をクリックするたびに、dbからすべての行がフェッチされます。そのため、アプリケーションのパフォーマンスが低下します。
15行を表示したい場合は、displayタグでそれが必要です。次にdisplayタグは、db行全体ではなくdbから15行もフェッチします。誰かが知っているなら私を助けてください。
display tagで、ページネーション機能を使用しました。15行のリストを表示したいのですが、displaytagはデータベースからすべての行をフェッチします。ページネーション番号をクリックするたびに、dbからすべての行がフェッチされます。そのため、アプリケーションのパフォーマンスが低下します。
15行を表示したい場合は、displayタグでそれが必要です。次にdisplayタグは、db行全体ではなくdbから15行もフェッチします。誰かが知っているなら私を助けてください。
You have to use external pagination feature. First, specify in html tag that you're using external pagination. And create an object implements org.displaytag.pagination.PaginatedList. Finally, you have to implement the DAO which makes actually query for 15 rows only and returns PaginatedList.
1) Your jsp will look like this
<display:table name="command" sort="external" partialList="true" size="${command.fullListSize}" pagesize="${command.objectsPerPage}">
<display:column property="name" title="name"/>
...
</display:table>
Note that it specified the sort is external.
2) org.displaytag.pagination.PaginatedList implementation.
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 Implementation sample using hibernate. You can do it with JDBC or anything but make sure you're making the right query to get 15 rows in proper order and return PaginatedListImpl object.
@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
、サイズ値をハードコーディングしてもエラーが発生します。私は他のリンク/ブログを調べましたが、多くの人がこれを指摘しています.
最後に使用したオプションは、データをセッションに保存することです。ユーザーが [次へ] をクリックすると、セッション内のデータがチェックされます。存在する場合、サービス層にはヒットしません。これまでのところ、うまく機能しています。