显示标签分页问题

时间:2010-10-08 07:05:54

标签: displaytag

在显示标签中我使用了分页功能,当我想查看15行的列表但是显示标签时,数据库中的所有行都是。每次当我点击分页编号时,它都会使db.bcoz中的所有行变得迟钝,这会​​降低应用程序的性能。

我希望在显示标记中当我想看到15行然后显示标记也从db中获取15行而不是整个db行。如果有人知道,Plz会帮助我。

3 个答案:

答案 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。我浏览了其他链接/博客,很多人都指出了这一点。

我最终使用的选项是将数据存储在会话中。当用户单击下一步时,它会检查会话中的数据。如果存在,则不会访问服务层。到目前为止,它运作良好。