- 浏览: 512218 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
jxq0816:
请问博主task:executortask:scheduler ...
Spring任务调度器之Task的使用 -
eithree:
thanks you so much! This proble ...
解决ECShop transport.js与jQuery冲突 -
周聪龙:
按照你的配置,点击登录按钮没反应呀,所有的Ip都改为自己的了呀 ...
自定义客户端登录CAS服务器-iframe实现 -
周聪龙:
denglihong 写道shangliuyan 写道我点击提 ...
自定义客户端登录CAS服务器-iframe实现 -
nihaonihao1987:
...
Spring任务调度器之Task的使用
花了两天时间才整理好的分页类,共享一下。
说明:该方法是参考了一下网上广为流传的DetachedCriteria查询方法后改进而来的。按照自己觉得满意的方法去修改了一下。并且配合struts1.2的标记配合使用,其实应该直接封装成自己分页标记的,或者使用JavaScript生成,但先这样吧,当作学习struts的标记库使用。
按钮的效果可以简单的做到附件图片上的效果
虽然不敢说完美的分页按钮,但比较满意的效果了。
------------------------------------
分页Bean类:
----------------------
DAO层,其实不需要局限用Criteria查询的。查询好需要的数据后,构造bean类,如下。
1. PaginationSupport ps = new PaginationSupport(items,
2. totalCount, pageSize, startIndex,
3. detachedCriteria);
附上完整的DetachedCriteria查询方法供参考。在网上找到的,然后参考改进了一下,因为找到的都存在BUG,下面是修正后的版本。测试,并且正常使用中。
----------------------
view层使用struts标签,代码有点长,供参考。注意css效果。
注意,action的方法其实需要两个即可,一个是第一次搜索的时候查询方法。另外一个是跳转到任何一页的方法。就算向前向后这样的方法其实并不需要。
说明:该方法是参考了一下网上广为流传的DetachedCriteria查询方法后改进而来的。按照自己觉得满意的方法去修改了一下。并且配合struts1.2的标记配合使用,其实应该直接封装成自己分页标记的,或者使用JavaScript生成,但先这样吧,当作学习struts的标记库使用。
按钮的效果可以简单的做到附件图片上的效果
虽然不敢说完美的分页按钮,但比较满意的效果了。
------------------------------------
分页Bean类:
import java.util.List; import org.hibernate.criterion.DetachedCriteria; /** * 分页常用的bean类。<br> * 里面包含搜索返回的List,查询条件DetachedCriteria及分页菜单用到的数据等。 * * @author KennyLee E-mail:kennylee26@gmail.com 2008-10-25 */ public class KPaginationSupport implements Cloneable { // Default page size public static final int PAGESIZE = 20; public static final int MENU_SIZE = 7; // total Rows private int totalRowsAmount; private int pageSize = PAGESIZE; private int totalPages; // current page number private int currentPage = 1; // next page number private int nextPage; // previous page number private int previousPage; // is has next page private boolean hasNext; // is has previous page private boolean hasPrevious; // current page start row number private int pageStartRow = 0; // current page end row number private int pageEndRow; private String[] pageMenuNum; private int menuSize = MENU_SIZE; // Pagination values private List items; // select detachedCriteria private DetachedCriteria detachedCriteria; public KPaginationSupport() { } public String[] getPageMenuNum() { return pageMenuNum; } public void setPageMenuNum(String[] pageMenuNum) { this.pageMenuNum = pageMenuNum; } public DetachedCriteria getDetachedCriteria() { return detachedCriteria; } public void setDetachedCriteria(DetachedCriteria detachedCriteria) { this.detachedCriteria = detachedCriteria; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } public void setPreviousPage(int previousPage) { this.previousPage = previousPage; } public void setHasNext(boolean hasNext) { this.hasNext = hasNext; } public void setHasPrevious(boolean hasPrevious) { this.hasPrevious = hasPrevious; } public void setPageStartRow(int pageStartRow) { this.pageStartRow = pageStartRow; } public List getItems() { return items; } public void setItems(List items) { this.items = items; } public void setPageEndRow(int pageEndRow) { this.pageEndRow = pageEndRow; } /** * 构造函数。 * * @param totalRows * 总行数 * @param currentPage * 当前页数 */ public KPaginationSupport(int totalRows, int currentPage) { setPaginationSupport(totalRows, currentPage); } /** * 构造函数。 * * @param totalRows * 总行数 * @param currentPage * 当前页数 * @param pageSize * 每页显示数量。 */ public KPaginationSupport(int totalRows, int currentPage, int pageSize) { this.pageSize = pageSize; this.setPaginationSupport(totalRows, currentPage); String[] pageNums = getPageMenuNums(currentPage); this.setPageMenuNum(pageNums); } public void setPaginationSupport(int totalRows, int currentPage) { // 获取总页码,通过对象总数还是每页多少行的关系 setTotalRowsAmount(totalRows); setCurrentPage(currentPage); } public KPaginationSupport(List items, int totalCount) { setPageSize(PAGESIZE); setItems(items); int currentPage = 1; this.setPaginationSupport(totalCount, currentPage); } public KPaginationSupport(List items, int totalCount, int startIndex) { setPageSize(PAGESIZE); setItems(items); int currentPage = (startIndex / pageSize) + 1; this.setPaginationSupport(totalCount, currentPage); } /** * @param items * 保存的目标List * @param totalCount * 查找的总行数 * @param pageSize * 每页显示的行数 * @param startIndex * 第几行开始 * */ public KPaginationSupport(List items, int totalCount, int pageSize, int startIndex) { setPageSize(pageSize); setItems(items); int currentPage = (startIndex / pageSize) + 1; this.setPaginationSupport(totalCount, currentPage); } /** * * 构造PS时的初始化方法。 * * @param items * 保存的目标List * @param totalCount * 查找的总行数 * @param pageSize * 每页显示的行数 * @param startIndex * 第几行开始 * */ public KPaginationSupport(List items, int totalCount, int pageSize, int startIndex, DetachedCriteria detachedCriteria) { setPageSize(pageSize); setItems(items); int currentPage = (startIndex / pageSize) + 1; this.setPaginationSupport(totalCount, currentPage); setDetachedCriteria(detachedCriteria); String[] pageNums = getPageMenuNums(currentPage); this.setPageMenuNum(pageNums); } /** * 分页导航按钮 * * @param currentPage * @return */ private String[] getPageMenuNums(int currentPage) { String[] pageNums = null; if (totalPages > menuSize) {// 总页数大于导航显示的页数 pageNums = new String[menuSize]; int lastMenuNum = totalPages - menuSize + 1;// 最后一列导航栏按钮 int beginMumNum = menuSize; int x = menuSize - 1;// 导航显示系数 if ((currentPage < lastMenuNum) && (currentPage > beginMumNum)) { for (int i = 0; i < menuSize; i++) { pageNums[i] = String.valueOf(currentPage + i - x / 2); } } else if (currentPage > lastMenuNum) { for (int i = 0; i < menuSize; i++) { pageNums[i] = String.valueOf(lastMenuNum + i); } } else if (currentPage == lastMenuNum) { if ((lastMenuNum - x / 2) < 1) { lastMenuNum = x / 2 + 1; } for (int i = 0; i < menuSize; i++) { pageNums[i] = String.valueOf(lastMenuNum + i - x / 2); } } else if (currentPage == beginMumNum) { for (int i = 0; i < menuSize; i++) { pageNums[i] = String.valueOf(1 + i + x / 2); } } else { for (int i = 0; i < menuSize; i++) { pageNums[i] = String.valueOf(1 + i); } } } else {// 总页数小于等于导航显示的页数,直接显示。 pageNums = new String[totalPages]; // 分页数比总页数少 for (int i = 0; i < totalPages; i++) { pageNums[i] = String.valueOf(i + 1); } } return pageNums; } /** * 设置总行数。 * * @param rows * 总行数。 */ private void setTotalRowsAmount(int rows) { if (rows < 0) { totalRowsAmount = 0; } else { totalRowsAmount = rows; } if (totalRowsAmount % pageSize == 0) { totalPages = totalRowsAmount / pageSize; } else { totalPages = totalRowsAmount / pageSize + 1; } } /** *设置当前页数。 * * @param curPage */ private void setCurrentPage(int curPage) { if (curPage <= 0) { currentPage = 1; } else if (curPage > totalPages) { currentPage = totalPages; } else { currentPage = curPage; } if (currentPage == 1) { hasPrevious = false; } else { hasPrevious = true; } if (currentPage == totalPages) { hasNext = false; } else { hasNext = true; } nextPage = currentPage + 1; previousPage = currentPage - 1; // 计算当前页开始行和结束行 pageStartRow = (currentPage - 1) * pageSize + 1; // pageStartRow = (currentPage - 1) * pageSize; // 记录索引从0开始 pageStartRow -= 1; pageEndRow = pageStartRow + pageSize; } public int getCurrentPage() { return currentPage; } public boolean isHasNext() { return hasNext; } public boolean isHasPrevious() { return hasPrevious; } public int getNextPage() { return nextPage; } public int getPageSize() { return pageSize; } public int getPreviousPage() { return previousPage; } public int getTotalPages() { return totalPages; } public int getTotalRowsAmount() { return totalRowsAmount; } public int getPageStartRow() { return pageStartRow; } public int getPageEndRow() { return pageEndRow; } public String description() { String description = "Total:" + this.getTotalRowsAmount() + " items " + this.getTotalPages() + " pages,Current page:" + this.currentPage + " Previous " + this.hasPrevious + " Next:" + this.hasNext + " start row:" + this.pageStartRow + " end row:" + this.pageEndRow; return description; } public void init() { // do some initialization work } @Override public KPaginationSupport clone() throws CloneNotSupportedException { return (KPaginationSupport) super.clone(); } public int getMenuSize() { return menuSize; } public void setMenuSize(int menuSize) { this.menuSize = menuSize; } }
----------------------
DAO层,其实不需要局限用Criteria查询的。查询好需要的数据后,构造bean类,如下。
1. PaginationSupport ps = new PaginationSupport(items,
2. totalCount, pageSize, startIndex,
3. detachedCriteria);
附上完整的DetachedCriteria查询方法供参考。在网上找到的,然后参考改进了一下,因为找到的都存在BUG,下面是修正后的版本。测试,并且正常使用中。
/** * @param detachedCriteria * @param pageSize * @param startIndex */ public PaginationSupport findPageByCriteria( final DetachedCriteria detachedCriteria, final int pageSize, final int startIndex) { log.info("in findByPage..."); return (PaginationSupport) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Criteria criteria = detachedCriteria .getExecutableCriteria(session); CriteriaImpl impl = (CriteriaImpl) criteria; // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作 Projection projection = impl.getProjection(); int totalCount = ((Integer) criteria.setProjection( Projections.rowCount()).uniqueResult()) .intValue(); log.info("totalCount:" + totalCount); // 将之前的Projection和OrderBy条件重新设回去 criteria.setProjection(projection); if (projection == null) { criteria .setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } List items = criteria.setFirstResult(startIndex) .setMaxResults(pageSize).list(); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex, detachedCriteria); // Set default status criteria.setFirstResult(0).setMaxResults(totalCount); return ps; } }); }
----------------------
view层使用struts标签,代码有点长,供参考。注意css效果。
注意,action的方法其实需要两个即可,一个是第一次搜索的时候查询方法。另外一个是跳转到任何一页的方法。就算向前向后这样的方法其实并不需要。
<!-- pagination menu begin by KennyLee 2008-9-16 --> <logic:present name="pageController" scope="request"> <tr> <td colspan="6"> <div id="pagination_info"> [共${pageController.totalRowsAmount} 个账号] ${pageController.currentPage}/${pageController.totalPages}页(每页显示${pageController.pageSize}) </div> <div class="pagination"> <logic:equal value="true" name="pageController" property="hasPrevious"> <html:link action="/mailbox/controller/list/pre" paramId="toPageGo" paramName="pageController" paramProperty="previousPage"><Perv</html:link> </logic:equal> <logic:notEqual value="true" name="pageController" property="hasPrevious"> <span class="disabled"><Perv</span> </logic:notEqual> <logic:iterate id="num" name="pageController" property="pageMenuNum" indexId="index"> <logic:equal value="0" name="index"> <logic:equal value="2" name="num"> <html:link page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link> </logic:equal> <logic:greaterThan value="2" name="num"> <html:link page="/mailbox/controller/list/current.jspx?toPageGo=1">1</html:link> <span>...</span> </logic:greaterThan> </logic:equal> <logic:equal value="${num}" property="currentPage" name="pageController"> <span class="current">${pageController.currentPage}</span> </logic:equal> <logic:notEqual value="${num}" property="currentPage" name="pageController"> <html:link page="/mailbox/controller/list/current.jspx?toPageGo=${num}">${num}</html:link> </logic:notEqual> <logic:equal value="${pageController.menuSize-1}" name="index"> <logic:equal value="${pageController.totalPages-1}" name="num"> <html:link page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link> </logic:equal> <logic:lessThan value="${pageController.totalPages-1}" name="num"> <span>...</span> <html:link page="/mailbox/controller/list/current.jspx?toPageGo=${pageController.totalPages}">${pageController.totalPages}</html:link> </logic:lessThan> </logic:equal> </logic:iterate> <logic:equal value="true" name="pageController" property="hasNext"> <html:link action="/mailbox/controller/list/next" paramId="toPageGo" paramName="pageController" paramProperty="nextPage">Next></html:link> </logic:equal> <logic:notEqual value="true" name="pageController" property="hasNext"> <span class="disabled">Next></span> </logic:notEqual> </div> </td> </tr> </logic:present> <!-- pagination menu end -->
发表评论
-
自己的修改hibernate-tools的模板和修复Comment乱码问题
2011-11-02 11:38 8033关于自定义 之前一直用hibernate-tools来 ... -
eclipse利用Hibernate Tools生成Hibernate Mapping文件及PO类
2011-05-11 00:54 24119俗话说得不错,“变化总比计划快”。在项目,在我们这些程序员当中 ... -
使用Hibernate.initialize解决no session的延迟加载问题
2011-05-01 22:07 2973出现no session or session was clo ... -
关于使用Hibernate findByExample的注意事项
2011-01-15 14:28 3613findByExample是一个很便利的查询的方法,通过传入的 ...
相关推荐
DetachedCriteria的查询方式汇总
DetachedCriteria
DetachedCriteria使用介绍
NULL 博文链接:https://chaoyi.iteye.com/blog/2152094
Hibernate - DetachedCriteria 的完整用法文档描述
源文件 博文链接:https://kings008.iteye.com/blog/246773
DetachedCriteria Criteria 使用方法 非常详细外加练习
下面小编就为大家带来一篇浅谈DetachedCriteria和Criteria的使用方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://rmn190.iteye.com/blog/379302
Spring 的框架提供了 getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据 DetachedCriteria 来返回查询结果。 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置...
().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结 果。 DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。
使用 Hibernate Criteria && DetachedCriteria Queries演示Exists Clause非常简单的项目 安装 git clone https://github.com/RameshRM/hibernate-sample.git 跑步 mvn install 这是一个maven项目,依赖项是 ...