2010-10-08 86 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