SSH分页(Hibernate实现简单分页查询)
直接正题
一、INewsDao.java(DAO接口):
1 package cn.dy.dao; 2 3 import java.util.List; 4 import cn.dy.bean.News; 5 6 public interface INewsDao { 7 8 //其他代码省略 9 10 11 //分页查询 12 public List<News> queryForPage(String hql,int offset,int length); 13 14 //总记录条数 15 public int getCount(String hql); 16 } 17
二、dao实现类,因为第13行中q.list().get(0)的返回值为long,所以转换一下。
1 @SuppressWarnings("unchecked") 2 @Override 3 public List<News> queryForPage(String hql,int offset, int length) { 4 Query q = factory.getCurrentSession().createQuery(hql); 5 q.setFirstResult(offset); 6 q.setMaxResults(length); 7 return q.list(); 8 } 9 10 @Override 11 public int getCount(String hql) { 12 Query q = factory.getCurrentSession().createQuery(hql); 13 return Integer.parseInt(q.list().get(0).toString()); 14 }
三、INewsService.java业务接口,添加方法
public PageBean queryForPage(int pageSize, int currentPage);
四、业务实现类代码,注意修改参数
1 @Override 2 public PageBean queryForPage(int pageSize, int page) { 3 String hql = "select count(*) from News"; 4 int count = newsDao.getCount(hql); // 总记录数 5 int totalPage = PageBean.countTotalPage(pageSize, count); // 总页数 6 int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录 7 int length = pageSize; // 每页记录数 8 int currentPage = PageBean.countCurrentPage(page); 9 List<News> list = newsDao.queryForPage("from News", offset, length); // 该分页的记录 10 // 把分页信息保存到Bean中 11 PageBean pageBean = new PageBean(); 12 pageBean.setPageSize(pageSize); 13 pageBean.setCurrentPage(currentPage); 14 pageBean.setAllRow(count); 15 pageBean.setTotalPage(totalPage); 16 pageBean.setList(list); 17 pageBean.init(); 18 return pageBean; 19 }
五、action代码:
private int page; private PageBean pageBean; 以及上面两个的get()、set()方法。 public String getPageList() { this.pageBean = newsService.queryForPage(6, page); return "newsList"; }
这个6,是每页6个数据,可以通过页面动态传值。
六、页面代码
1、显示代码:
1 <s:iterator value="pageBean.list"> 2 <tr> 3 <td class="tocenter"> 4 <s:property value="newsId" /> 5 </td> 6 <td colspan="5"> 7 <s:property value="newsContent" /> 8 </td> 9 <td class="tocenter"> 10 <s:property value="beginTime" /> 11 </td> 12 </tr> 13 </s:iterator>
2、分页:
1 <tr> 2 <td width="13%" class="tocenter"> 3 共 4 <s:property value="pageBean.totalPage" /> 5 页 6 </td> 7 <td width="17%" class="tocenter"> 8 共 9 <s:property value="pageBean.allRow" /> 10 条记录 11 </td> 12 <td width="15%" class="tocenter"> 13 当前第 14 <s:property value="pageBean.currentPage" /> 15 页 16 </td> 17 <td colspan="4" width="55%" class="tocenter"> 18 <s:if test="%{pageBean.currentPage == 1}">第一页 上一页 </s:if> 19 <s:else> 20 <a href="/DyEnigma/news/op_getPageList.do?page=1">第一页 </a> 21 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage-1}"/>">上一页 </a> 22 </s:else> 23 <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> 24 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页 </a> 25 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="pageBean.totalPage"/>">最后一页</a> 26 </s:if> 27 <s:else>下一页 最后一页</s:else> 28 </td> 29 </tr>
七、PageBean文件
1package cn.dy.own; 2 3import java.util.List; 4 5@SuppressWarnings("unchecked") 6public class PageBean { 7 8 private List list;// 要返回的某一页的记录列表 9 10 private int allRow; // 总记录数 11 private int totalPage; // 总页数 12 private int currentPage; // 当前页 13 private int pageSize;// 每页记录数 14 15 @SuppressWarnings("unused") 16 private boolean isFirstPage; // 是否为第一页 17 @SuppressWarnings("unused") 18 private boolean isLastPage;// 是否为最后一页 19 @SuppressWarnings("unused") 20 private boolean hasPreviousPage; // 是否有前一页 21 @SuppressWarnings("unused") 22 private boolean hasNextPage;// 是否有下一页 23 24 public List getList() { 25 return list; 26 } 27 28 public void setList(List list) { 29 this.list = list; 30 } 31 32 public int getAllRow() { 33 return allRow; 34 } 35 36 public void setAllRow(int allRow) { 37 this.allRow = allRow; 38 } 39 40 public int getTotalPage() { 41 return totalPage; 42 } 43 44 public void setTotalPage(int totalPage) { 45 this.totalPage = totalPage; 46 } 47 48 public int getCurrentPage() { 49 return currentPage; 50 } 51 52 public void setCurrentPage(int currentPage) { 53 this.currentPage = currentPage; 54 } 55 56 public int getPageSize() { 57 return pageSize; 58 } 59 60 public void setPageSize(int pageSize) { 61 this.pageSize = pageSize; 62 } 63 64 /** 65 * 初始化分页信息 66 */ 67 public void init() { 68 this.isFirstPage = isFirstPage(); 69 this.isLastPage = isLastPage(); 70 this.hasPreviousPage = isHasPreviousPage(); 71 this.hasNextPage = isHasNextPage(); 72 } 73 74 /** 75 * 以下判断页的信息,只需getter方法(is方法)即可 76 * 77 * @return 78 */ 79 public boolean isFirstPage() { 80 return currentPage == 1; // 如是当前页是第1页 81 } 82 83 public boolean isLastPage() { 84 return currentPage == totalPage; // 如果当前页是最后一页 85 } 86 87 public boolean isHasPreviousPage() { 88 return currentPage != 1;// 只要当前页不是第1页 89 } 90 91 public boolean isHasNextPage() { 92 return currentPage != totalPage; // 只要当前页不是最后1页 93 } 94 95 /** 96 * 计算总页数,静态方法,供外部直接通过类名调用 97 * 98 * @param pageSize每页记录数 99 * @param allRow总记录数 100 * @return 总页数 101 */ 102 public static int countTotalPage(final int pageSize, final int allRow) { 103 int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1; 104 return totalPage; 105 } 106 107 /** 108 * 计算当前页开始记录 109 * 110 * @param pageSize每页记录数 111 * @param currentPage当前第几页 112 * @return 当前页开始记录号 113 */ 114 public static int countOffset(final int pageSize, final int currentPage) { 115 final int offset = pageSize * (currentPage - 1); 116 return offset; 117 } 118 119 /** 120 * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替 121 * 122 * @paramPage 传入的参数(可能为空,即0,则返回1) 123 * @return 当前页 124 */ 125 public static int countCurrentPage(int page) { 126 final int curPage = (page == 0 ? 1 : page); 127 return curPage; 128 } 129}