SSH2实现数据库和界面的分页

分页应该是在我们开发web应用时经常要做的工作,能够比较简洁的实现数据库和视图层的分页十分重要。

在数据库层利用Hibernate进行数据库的分页,将从数据库中查询出的数据封装为javabean;在视图层就可以方便的实现分页。

创建PageBean

  1. package com.fishing.common.bean;
  2. import java.util.List;
  3. @SuppressWarnings("unchecked")
  4. publicclass PageBean {
  5. private List list; // 要返回的某一页的记录列表
  6. privateint allRow; // 总记录数
  7. privateint totalPage; // 总页数
  8. privateint currentPage; // 当前页
  9. privateint pageSize; // 每页记录数
  10. privateboolean isFirstPage; // 是否为第一页
  11. privateboolean isLastPage; // 是否为最后一页
  12. privateboolean hasPreviousPage; // 是否有前一页
  13. privateboolean hasNextPage; // 是否有下一页
  14. public List getList() {
  15. return list;
  16. }
  17. publicvoid setList(List list) {
  18. this.list = list;
  19. }
  20. publicint getAllRow() {
  21. return allRow;
  22. }
  23. publicvoid setAllRow(int allRow) {
  24. this.allRow = allRow;
  25. }
  26. publicint getTotalPage() {
  27. return totalPage;
  28. }
  29. publicvoid setTotalPage(int totalPage) {
  30. this.totalPage = totalPage;
  31. }
  32. publicint getCurrentPage() {
  33. return currentPage;
  34. }
  35. publicvoid setCurrentPage(int currentPage) {
  36. this.currentPage = currentPage;
  37. }
  38. publicint getPageSize() {
  39. return pageSize;
  40. }
  41. publicvoid setPageSize(int pageSize) {
  42. this.pageSize = pageSize;
  43. }
  44. /** */
  45. /**
  46. * 初始化分页信息
  47. */
  48. publicvoid init() {
  49. this.isFirstPage = isFirstPage();
  50. this.isLastPage = isLastPage();
  51. this.hasPreviousPage = isHasPreviousPage();
  52. this.hasNextPage = isHasNextPage();
  53. }
  54. /** */
  55. /**
  56. * 以下判断页的信息,只需getter方法(is方法)即可
  57. *
  58. * @return
  59. */
  60. publicboolean isFirstPage() {
  61. return (currentPage == 1);// 如是当前页是第1页
  62. }
  63. publicboolean isLastPage() {
  64. return currentPage == totalPage; //如果当前页是最后一页
  65. }
  66. publicboolean isHasPreviousPage() {
  67. return currentPage != 1; //只要当前页不是第1页
  68. }
  69. publicboolean isHasNextPage() {
  70. return currentPage != totalPage; //只要当前页不是最后1页
  71. }
  72. /** */
  73. /**
  74. * 计算总页数,静态方法,供外部直接通过类名调用
  75. *
  76. * @param pageSize
  77. * 每页记录数
  78. * @param allRow
  79. * 总记录数
  80. * @return 总页数
  81. */
  82. publicstaticint countTotalPage(finalint pageSize, finalint allRow) {
  83. int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow
  84. / pageSize + 1;
  85. return totalPage;
  86. }
  87. /** */
  88. /**
  89. * 计算当前页开始记录
  90. *
  91. * @param pageSize
  92. * 每页记录数
  93. * @param currentPage
  94. * 当前第几页
  95. * @return 当前页开始记录号
  96. */
  97. publicstaticint countOffset(finalint pageSize, finalint currentPage) {
  98. finalint offset = pageSize * (currentPage - 1);
  99. return offset;
  100. }
  101. /** */
  102. /**
  103. * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
  104. *
  105. * @param page
  106. * 传入的参数(可能为空,即0,则返回1)
  107. * @return 当前页
  108. */
  109. publicstaticint countCurrentPage(int page) {
  110. finalint curPage = (page == 0 ? 1 : page);
  111. return curPage;
  112. }
  113. }

在Dao的抽象接口BaseDao中添加方法

  1. public List queryForPage(final String hql, finalint offset,
  2. finalint length);

在Dao的实现类JianSheDWDaoImpl中实现方法

  1. public List queryForPage(final String hql, finalint offset,
  2. finalint length) {
  3. List list = getHibernateTemplate().executeFind(new HibernateCallback() {
  4. public Object doInHibernate(Session session)
  5. throws HibernateException, SQLException {
  6. Query query = session.createQuery(hql);
  7. query.setFirstResult(offset);
  8. query.setMaxResults(length);
  9. List list = query.list();
  10. return list;
  11. }
  12. });
  13. return list;
  14. }

在service抽象层接口JianSheDWService中添加方法

  1. public PageBean queryForPage(int pageSize,int currentPage);

在service实现类中实现方法

  1. public PageBean queryForPage(int pageSize, int page) {
  2. final String hql = "from JianSheDWBean"; // 查询语句
  3. int allRow = this.baseDao.getAllRowCount(hql); // 总记录数
  4. int totalPage = PageBean.countTotalPage(pageSize, allRow); // 总页数
  5. finalint offset = PageBean.countOffset(pageSize, page); // 当前页开始记录
  6. finalint length = pageSize; // 每页记录数
  7. finalint currentPage = PageBean.countCurrentPage(page);
  8. List<JianSheDWBean> list = this.baseDao.queryForPage(hql, offset, length); // "一页"的记录
  9. // 把分页信息保存到Bean中
  10. PageBean pageBean = new PageBean();
  11. pageBean.setPageSize(pageSize);
  12. pageBean.setCurrentPage(currentPage);
  13. pageBean.setAllRow(allRow);
  14. pageBean.setTotalPage(totalPage);
  15. pageBean.setList(list);
  16. pageBean.init();
  17. return pageBean;
  18. }

在视图层action中建立分页模型

  1. package com.fishing.action.lcq;
  2. import com.fishing.common.bean.JianSheDWBean;
  3. import com.fishing.common.bean.PageBean;
  4. import com.fishing.service.lcq.JianSheDWService;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. @SuppressWarnings("serial")
  7. publicclass GetInfoJSDWListAction extends ActionSupport {
  8. privateint page; // 第几页
  9. private PageBean pageBean; // 包含分布信息的bean
  10. private JianSheDWBean jianSheDWBean;
  11. // private PageBean page;
  12. private JianSheDWService jianSheDWService;
  13. publicint getPage() {
  14. return page;
  15. }
  16. publicvoid setPage(int page) {
  17. this.page = page;
  18. }
  19. public PageBean getPageBean() {
  20. return pageBean;
  21. }
  22. publicvoid setPageBean(PageBean pageBean) {
  23. this.pageBean = pageBean;
  24. }
  25. public JianSheDWBean getJianSheDWBean() {
  26. return jianSheDWBean;
  27. }
  28. publicvoid setJianSheDWBean(JianSheDWBean jianSheDWBean) {
  29. this.jianSheDWBean = jianSheDWBean;
  30. }
  31. public JianSheDWService getJianSheDWService() {
  32. return jianSheDWService;
  33. }
  34. publicvoid setJianSheDWService(JianSheDWService jianSheDWService) {
  35. this.jianSheDWService = jianSheDWService;
  36. }
  37. @Override
  38. public String execute() throws Exception {
  39. //分页的pageBean,参数pageSize表示每页显示记录数,page为当前页
  40. this.pageBean = jianSheDWService.queryForPage(10, page);
  41. return SUCCESS;
  42. }
  43. }

在jsp中编写分页

  1. <trclass="odd">
  2. <td>
  3. &nbsp;
  4. </td>
  5. <td>
  6. <s:iftest="%{pageBean.currentPage == 1}">
  7. 首页 上一页
  8. </s:if>
  9. <s:else>
  10. <ahref="jianguan/getJSDWInfos.action?page=1">首页</a>
  11. <a
  12. href="jianguan/getJSDWInfos.action?page=<s:property value="%{pageBean.currentPage-1}"/>" />上一页</a>
  13. </s:else>
  14. </td>
  15. <td>
  16. <s:iftest="%{pageBean.currentPage != pageBean.totalPage}">
  17. <a
  18. href="jianguan/getJSDWInfos.action?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页</a>
  19. <a
  20. href="jianguan/getJSDWInfos.action?page=<s:property value="pageBean.totalPage"/>">尾页
  21. </a>
  22. </s:if>
  23. <s:else>
  24. 下一页 尾页
  25. </s:else>
  26. </td>
  27. <td>
  28. <divalign="center">
  29. 页次
  30. <s:propertyvalue="pageBean.currentPage"/>
  31. /
  32. <s:propertyvalue="pageBean.totalPage"/>
  33. &nbsp;&nbsp;&nbsp;共
  34. <s:propertyvalue="pageBean.allRow"/>
  35. 记录
  36. </div>
  37. <divalign="center"></div>
  38. </td>
  39. </tr>

上面只是代码的实现,没有说明配置文件的配置,读者根据情况配置。

posted on 2012-04-27 19:21  Eleven_Niu  阅读(231)  评论(0编辑  收藏  举报