在显示标签中我使用了分页功能,当我想查看15行的列表但是显示标签时,数据库中的所有行都是。每次当我点击分页编号时,它都会使db.bcoz中的所有行变得迟钝,这会降低应用程序的性能。
我希望在显示标记中当我想看到15行然后显示标记也从db中获取15行而不是整个db行。如果有人知道,Plz会帮助我。
答案 0 :(得分: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)使用hibernate的DAO实现示例。您可以使用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;
}
答案 1 :(得分:2)
Displaytag使用以“d-”开头的参数发送它的分页和排序数据。 所以快速解决方案可以检查请求是否包含以“d - ”开头的内容,如果是,则不再执行查询。
答案 2 :(得分:0)
由于某些原因使用PaginatedList
似乎不起作用。我尝试使用最新版本,似乎有一些错误,即使我硬编码大小值,也会出现错误attribute size must be specified
。我浏览了其他链接/博客,很多人都指出了这一点。
我最终使用的选项是将数据存储在会话中。当用户单击下一步时,它会检查会话中的数据。如果存在,则不会访问服务层。到目前为止,它运作良好。