在显示标签,我用分页功能,当我想看到的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