分页(简版)

分页技术:

JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100页;好处:利于页面布局,且显示的效率高!

使用技术:

       jsp+Servlet+c3p0+mySql+DbUtils组件+ 3层结构(web层+service层+dao层)

分页流程图:


分页关键点:

1.分页SQL语句;
2.后台处理: dao/service/servlet/JSP

实现步骤:

1. 环境准备
a) 引入jar文件及引入配置文件
i. 数据库驱动包
ii. C3P0连接池jar文件 及 配置文件
iii. DbUtis组件:QueryRunner qr = new QueryRuner(dataSouce);
            qr.update(sql);
b) 公用类: JdbcUtils.java
2. 先设计:PageBean.java
3. Dao接口设计/实现:   2个方法
4. Service/servlet
5. JSP

项目源码:

分页项目结构:



主要代码设计:

PageBean.java分页实体类

    
    
  1. package com.cn.entity;
  2. import java.util.List;
  3. /**
  4. * 每一页数据参数实体
  5. * @author liuzhiyong
  6. *
  7. * @param <T>
  8. */
  9. public class PageBean<T> {
  10. private int currentPage;//当前页
  11. private int totalPage;//总页数
  12. private int totalDataRows;//数据总行数
  13. private int countPerPage = 4;//每页显示行数,默认显示4行
  14. private List<T> dataList;//分页查询得到的数据集合,注意这里用泛型较好
  15. public int getCurrentPage() {
  16. return currentPage;
  17. }
  18. public void setCurrentPage(int currentPage) {
  19. this.currentPage = currentPage;
  20. }
  21. public int getTotalPage() {
  22. //计算总页数
  23. return (totalDataRows % countPerPage == 0)?(totalDataRows/countPerPage):(totalDataRows/countPerPage+1);
  24. }
  25. public int getTotalDataRows() {
  26. return totalDataRows;
  27. }
  28. public void setTotalDataRows(int totalDataRows) {
  29. this.totalDataRows = totalDataRows;
  30. }
  31. public int getCountPerPage() {
  32. return countPerPage;
  33. }
  34. public void setCountPerPage(int countPerPage) {
  35. this.countPerPage = countPerPage;
  36. }
  37. public List<T> getDataList() {
  38. return dataList;
  39. }
  40. public void setDataList(List<T> dataList) {
  41. this.dataList = dataList;
  42. }
  43. }

dao设计

   
   
  1. package com.cn.dao.impl;
  2. import java.sql.SQLException;
  3. import java.util.List;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanListHandler;
  6. import org.apache.commons.dbutils.handlers.ScalarHandler;
  7. import com.cn.dao.PageDao;
  8. import com.cn.entity.PageBean;
  9. import com.cn.entity.User;
  10. import com.cn.utils.JdbcUtils;
  11. public class PageDaoImpl implements PageDao {
  12. //创建DbUtils组件的核心工具类
  13. private QueryRunner qr = JdbcUtils.getQueryRunner();
  14. /**
  15. * 根据传入的参数,封装pageBean所有参数,注意这里可以不用返回PageBean
  16. */
  17. public void getPageData(PageBean<User> pageBean) {
  18. //获取数据总行数,并封装入pageBean
  19. int totalDataRows = this.getTotalDataRows();
  20. pageBean.setTotalDataRows(totalDataRows);
  21. int countPerPage = pageBean.getCountPerPage();//获取每页返回的行数
  22. /**
  23. * 问题:在jsp页面,如果当前页为首页,再点击上一页报错;如果当前页为末页,再点下一页显示有问题;
  24. * 解决:判断
  25. * 1.如果当前页<=0; 设置当前页为1
  26. * 2.如果当前页>最大页数;设置当前页为最大页数
  27. *
  28. * 注意:jsp页面中也可直接判断,但是页面单纯做显示用较好,少进行逻辑判断为好
  29. */
  30. if(pageBean.getCurrentPage() <= 0){
  31. pageBean.setCurrentPage(1);//设置当前页为1
  32. }else if(pageBean.getCurrentPage() > pageBean.getTotalPage()){
  33. pageBean.setCurrentPage(pageBean.getTotalPage());//设置当前页为最大页数
  34. }
  35. int currentPage = pageBean.getCurrentPage();//获取当前页
  36. int startIndex = (currentPage-1)*countPerPage;//计算起始行
  37. //sql查询语句
  38. String sql = "select * from users limit ?,?";
  39. //创建存放数据的集合对象
  40. List<User> list = null;
  41. try {
  42. list = qr.query(sql, new BeanListHandler<User>(User.class), startIndex, countPerPage);
  43. //将查询出来的当前页数据放入pageBean
  44. pageBean.setDataList(list);
  45. } catch (SQLException e) {
  46. e.printStackTrace();
  47. throw new RuntimeException(e);
  48. }
  49. }
  50. /**
  51. * 获取数据总行数
  52. * @return
  53. */
  54. public int getTotalDataRows(){
  55. //sql语句
  56. String sql = "select count(*) from users";
  57. //返回的数据总行数
  58. try {
  59. Long count = qr.query(sql, new ScalarHandler<Long>());//返回结果的第一行的第一列
  60. return count.intValue();
  61. } catch (SQLException e) {
  62. e.printStackTrace();
  63. throw new RuntimeException(e);
  64. }
  65. }
  66. }

service逻辑业务层

   
   
  1. package com.cn.service.impl;
  2. import com.cn.dao.PageDao;
  3. import com.cn.dao.impl.PageDaoImpl;
  4. import com.cn.entity.PageBean;
  5. import com.cn.entity.User;
  6. import com.cn.service.PageService;
  7. /**
  8. * 业务逻辑层实现
  9. * @author liuzhiyong
  10. *
  11. */
  12. public class PageServiceImpl implements PageService {
  13. //创建dao实例
  14. PageDao dao = new PageDaoImpl();
  15. @Override
  16. public void getPageData(PageBean<User> pageBean) {
  17. dao.getPageData(pageBean);
  18. }
  19. }

servlet控制层

   
   
  1. package com.cn.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import com.cn.entity.PageBean;
  8. import com.cn.entity.User;
  9. import com.cn.service.impl.PageServiceImpl;
  10. /**
  11. * 控制层开发
  12. * @author liuzhiyong
  13. *
  14. */
  15. public class PageServlet extends HttpServlet {
  16. //创建Service实例
  17. private
  18. PageServiceImpl service = new PageServiceImpl();
  19. //跳转资源
  20. private String uri;
  21. public void doGet(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23. this.doPost(request, response);
  24. }
  25. public void doPost(HttpServletRequest request, HttpServletResponse response)
  26. throws ServletException, IOException {
  27. try {
  28. //创建PageBean对象,设置当前页参数,传入Service方法参数(PageBean)
  29. PageBean<User> pageBean = new PageBean<User>();
  30. //获取“当前页"参数(第一次访问访问当前页的时候为null)
  31. String currentPage1 = request.getParameter("currentPage");
  32. //判断
  33. if(currentPage1==null || "".equals(currentPage1.trim())){
  34. currentPage1 = "1";//第一次访问时,设置当前页为1
  35. }
  36. //转换为int
  37. int currentPage = Integer.parseInt(currentPage1);
  38. //将当前页封装到pageBean对象中
  39. pageBean.setCurrentPage(currentPage);
  40. //调用业务逻辑获取当前页的数据pageBean
  41. service.getPageData(pageBean);//此时pageBean已经填充了数据
  42. //将pageBean对象数据pageData放入域对象
  43. request.setAttribute("pageBean", pageBean);
  44. //转发到显示页面
  45. uri = "/index.jsp";
  46. } catch (Exception e) {
  47. e.printStackTrace();//测试使用
  48. //出现错误,跳转到错误页面,给用户友好提示
  49. uri = "/error/error.jsp";
  50. }
  51. request.getRequestDispatcher(uri).forward(request, response);
  52. }
  53. }

JdbcUtils工具类

   
   
  1. package com.cn.utils;
  2. import org.apache.commons.dbutils.QueryRunner;
  3. import com.mchange.v2.c3p0.ComboPooledDataSource;
  4. public class JdbcUtils {
  5. /**
  6. * 1.初始化c3p0连接池
  7. */
  8. private static ComboPooledDataSource ds;
  9. static{
  10. ds = new ComboPooledDataSource();
  11. }
  12. /**
  13. * 2. 创建DbUtils核心工具类对象
  14. */
  15. public static QueryRunner getQueryRunner(){
  16. /*
  17. * 创建QueryRunner对象,传入连接池对象。在创建QueryRunner对象的时候,
  18. * 如果传入了数据源对象,那么在使用QueryRunner对象方法的时候,就不需要传入连接对象,会自动从数据源中获取连接(不用关闭连接)
  19. */
  20. return new QueryRunner(ds);
  21. }
  22. }

分页显示页面:

   
   
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!-- 引入jstl核心标签库 -->
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6. <head>
  7. <title>My JSP 'index.jsp' starting page</title>
  8. <meta http-equiv="pragma" content="no-cache">
  9. <meta http-equiv="cache-control" content="no-cache">
  10. <meta http-equiv="expires" content="0">
  11. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  12. <meta http-equiv="description" content="This is my page">
  13. <!--
  14. <link rel="stylesheet" type="text/css" href="styles.css">
  15. -->
  16. </head>
  17. <body>
  18. <table border="1" cellpadding="5" cellspacing="0" align="center" width="50%">
  19. <tr>
  20. <th>编号</th>
  21. <th>姓名</th>
  22. <th>密码</th>
  23. </tr>
  24. <!-- 迭代数据 -->
  25. <c:choose>
  26. <%-- 判断pageBean中集合不为空和null则迭代集合 --%>
  27. <c:when test="${not empty requestScope.pageBean.dataList }">
  28. <c:forEach items="${requestScope.pageBean.dataList }" var="user">
  29. <tr align="center">
  30. <td>${user.id }</td>
  31. <td>${user.name }</td>
  32. <td>${user.password }</td>
  33. </tr>
  34. </c:forEach>
  35. </c:when>
  36. <%-- 判断pageBean中集合为空 --%>
  37. <c:otherwise>
  38. <tr>
  39. <td colspan="3">对不起,没有您要找的数据</td>
  40. </tr>
  41. </c:otherwise>
  42. </c:choose>
  43. <tr align="center">
  44. <td colspan="3">
  45. 当前第${requestScope.pageBean.currentPage }页&nbsp;共${requestScope.pageBean.totalPage }页&nbsp;
  46. <a href="${pageContext.request.contextPath }/PageServlet?currentPage=1">【首页】</a>&nbsp;
  47. <a href="${pageContext.request.contextPath }/PageServlet?currentPage=${requestScope.pageBean.currentPage-1}">【上一页】</a>&nbsp;
  48. <a href="${pageContext.request.contextPath }/PageServlet?currentPage=${requestScope.pageBean.currentPage+1}">【下一页】</a>&nbsp;
  49. <a href="${pageContext.request.contextPath }/PageServlet?currentPage=${requestScope.pageBean.totalPage}">【末页】</a>&nbsp;
  50. </td>
  51. </tr>
  52. </table>
  53. </body>
  54. </html>

效果页面:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值