一、显示数据库中的多条数据为什么要用分页

在真正的开发中,数据库中所存储的数据绝对不像我们平时所写的那样,仅仅有几条数据,而是有几十条甚至上百条,像淘宝京东的用户把都是上几十万甚至百万的。如果这时候在将所有的数据都显示出来那肯定是不现实的,第一、浏览器的页面就那么大,肯定显示不全;第二、一次将这些数据全部查询出来再进行操作,那对于整个数据库的消耗那是相当大的。

因此,实际开发中使用分页来显示数据是十分有必要的。话不多说,进入今天咱们的话题:分页的具体实现步骤。(这里以我自己做的一个小程序为例)

二、让我们先来看一下分页之后的效果。

这是我自己做的一个jsp显示出来的,没有加多少css样式,很简单,有点丑,各位就凑合看吧,毕竟今天咱们的重点不是这!

从这张图中我么你可以看出来,本页面实现了分页的功能,一共分为7页,每页5条记录。这里面的超链接以及文本框都是可以操作的。

三、具体的实现步骤

1、首先你需要有一个类,Student.java用来生成学生的各种属性以及它们的get、set方法。还需要有一个page类,用来存储Student对象列表以及总记录数、当前页、每页的记录条数等属性以及它们的get、set方法。如图:

加了注释的那两个属性我们不可以对其进行set,因此只有它们的get方法。

之所以这么写这两个的get方法想必不用我多说了吧,稍微懂点脑子就能计算出来。

2、你需要连接数据库

3、进入重点部分,即Dao层的编写(这里只说与分页有关的)

  1. public List<Student> limitAll(int index,int pageSize){
  2. Connection conn=DBUtils.getConnection();
  3. String sql="select * from student limit ?,?";
  4. PreparedStatement ps = null;
  5. List<Student> list = null;
  6. ResultSet rs = null;
  7. try {
  8. ps=conn.prepareStatement(sql);
  9. ps.setInt(1, index);
  10. ps.setInt(2, pageSize);
  11. rs = ps.executeQuery();
  12. list=new ArrayList<Student>();
  13. while(rs.next()){
  14. Student student=new Student();
  15. student.setId(rs.getInt(1));
  16. student.setName(rs.getString(2));
  17. student.setNumber(rs.getString(3));
  18. student.setSchool(rs.getString(4));
  19. student.setEmail(rs.getString(5));
  20. list.add(student);
  21. }
  22. } catch (SQLException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }finally{
  26. try {
  27. DBUtils.colse(conn, ps, rs);
  28. } catch (SQLException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. }
  33. return list;
  34. }
  35.  
  36. public int getTotalRecord(){
  37. Connection conn=DBUtils.getConnection();
  38. String sql="select count(*) as total from student";
  39. PreparedStatement ps = null;
  40. ResultSet rs = null;
  41. int total=0;
  42. try {
  43. ps=conn.prepareStatement(sql);
  44. rs = ps.executeQuery();
  45. if(rs.next()){
  46. total=rs.getInt("total");
  47. }
  48. } catch (SQLException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. }finally{
  52. try {
  53. DBUtils.colse(conn, ps, rs);
  54. } catch (SQLException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58. }
  59. return total;
  60. }

  select * from student limit ?,?;

  1. 这句代码是数据库中的分页查询的语句。第一个“?”为索引值,第二个“?”为每页的记录数。
    例如:select * from student limit 0,3 便是输出表中的前三条数据。
    第一个函数通过输入索引值和每页的记录数,返回一个StudentList;第二个函数计算出此表的总记录数。
    4service层的编写:
  1. public Page<Student> limitAll(int pageNumber,int pageSize){
  2. int totalRecord=studentDao.getTotalRecord();
  3. Page<Student> page=new Page<Student>();
  4. page.setPageSize(pageSize);
  5. page.setTotalRecord(totalRecord);
  6. if(pageNumber<1){
  7. pageNumber=1;
  8. }else if(pageNumber>page.getTotalPage()){
  9. pageNumber=page.getTotalPage();
  10. }
  11. page.setPageNumber(pageNumber);
  12. List<Student> list=studentDao.limitAll(page.getIndex(), pageSize);
  13. page.setData(list);
  14. return page;
  15. }

  通过这一部分的编写,我们可以在servlet中只需输入两个参数:当前页和每页的记录条数。就能将整个分页后当前页student的List得到。

5、Servlet层的编写

private static int pagesize=5;
private static int pagenum=1;

这里我们声明两个static的变量,即默认显示的当前页为第一页,每页的记录条数为5条。

通过:Page<Student> page=service.limitAll(pagenum, pagesize);

我们可以生成当前五条记录的一个学生信息的列表。当然这里你需要有一个登录页面来登录进去。此时我们就得到了开始的那个页面。

6、对jsp页面的编写:

  1. <body>
  2. <div id="find">
  3. <form action="Servlet?oper=findByNameOrId" method="post">
  4. <input type="text" name="find">
  5. <input type="submit" value="查找">
  6. </form>
  7. </div>
  8. <div id="tablee">
  9. <table border="1" align="center">
  10. <tr>
  11. <th>姓名</th>
  12. <th>学号</th>
  13. <th>学校</th>
  14. <th>邮箱</th>
  15. <th colspan="2">操作</th>
  16. </tr>
  17. <c:forEach items="${page.data}" var="student">
  18. <tr>
  19. <td>${student.name}</td>
  20. <td>${student.number}</td>
  21. <td>${student.school}</td>
  22. <td>${student.email}</td>
  23. <td><a href="Servlet?id=${student.id}&oper=update&fnum=two&pagenum=${page.pageNumber}">修改</a></td>
  24. <td><a href="Servlet?id=${student.id}&oper=delete&fnum=two&pagenum=${page.pageNumber}">删除</a></td>
  25. </tr>
  26. </c:forEach>
  27. <tr>
  28. <th colspan="4"><a href="Servlet?oper=register&fnum=two&pagenum=${page.pageNumber}">添加</a></th>
  29. </tr>
  30. </table>

  这是整个table,包含学生信息和修改,删除,添加等超链接。

  1. <div id="page">
  2. <a href="Servlet?pagenum=1&oper=login&fnum=two&fl=1">首页</a>
  3. <a href="Servlet?pagenum=${page.pageNumber-1}&oper=login&fl=1&fnum=two&fl=1">上一页</a>
  4. <c:choose>
  5. <c:when test="${page.totalPage<=5}">
  6. <c:forEach begin="1" end="${page.totalPage}" var="num">
  7. <c:if test="${page.pageNumber==num }">
  8. [${num}]
  9. </c:if>
  10. <c:if test="${page.pageNumber!=num}">
  11. <a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
  12. </c:if>
  13. </c:forEach>
  14. </c:when>
  15. <c:when test="${page.totalPage>5}">
  16. <c:if test="${page.pageNumber<=3}">
  17. <c:set var="begin" value="1"></c:set>
  18. <c:set var="end" value="5"></c:set>
  19. <c:forEach begin="${begin}" end="${end}" var="num">
  20. <c:if test="${page.pageNumber==num }">
  21. [${num}]
  22. </c:if>
  23. <c:if test="${page.pageNumber!=num}">
  24. <a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
  25. </c:if>
  26. </c:forEach>
  27. </c:if>
  28. <c:if test="${page.pageNumber>3}">
  29. <c:set var="begin" value="${page.pageNumber-2}"></c:set>
  30. <c:set var="end" value="${page.pageNumber+2}"></c:set>
  31. <c:if test="${page.pageNumber>=page.totalPage-2}">
  32. <c:set var="begin" value="${page.totalPage-4}"></c:set>
  33. <c:set var="end" value="${page.totalPage}"></c:set>
  34. <c:forEach begin="${begin}" end="${end}" var="num">
  35. <c:if test="${page.pageNumber==num }">
  36. [${num}]
  37. </c:if>
  38. <c:if test="${page.pageNumber!=num}">
  39. <a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
  40. </c:if>
  41. </c:forEach>
  42. </c:if>
  43. <c:if test="${page.pageNumber<page.totalPage-2}">
  44. <c:forEach begin="${begin}" end="${end}" var="num">
  45. <c:if test="${page.pageNumber==num }">
  46. [${num}]
  47. </c:if>
  48. <c:if test="${page.pageNumber!=num}">
  49. <a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
  50. </c:if>
  51. </c:forEach>
  52. </c:if>
  53. </c:if>
  54. </c:when>
  55. </c:choose>
  56.  
  57. <a href="Servlet?pagenum=${page.pageNumber+1}&fnum=two&oper=login&fl=1">下一页</a>
  58. <a href="Servlet?pagenum=${page.totalPage}&fnum=two&oper=login&fl=1">末页</a>
  59. 共${page.totalPage}页 ${page.totalRecord}条记录
  60. 去第<input type="text" id="num">
  61. <input type="button" value="确定" id="btn_id">
  62. <script type="text/javascript">
  63. $("#btn_id").click(function(){
  64. var num1=$("#num").val();
  65. window.location="Servlet?oper=login&fl=1&fnum=two&pagenum="+num1;
  66. });
  67. </script>
  68. </div>

这是显示table下面关于分页的显示以及超链接代码。
说道这,有关分页的特别核心的内容已经说完。剩下的代码就需要各位小伙伴们自己去写了。
如果还有不懂的地方或者还需要完整的代码可以留言!

 

分页(将数据库中的多条数据一页一页的显示在jsp页面中)的更多相关文章

  1. 关于jsp页面中时间显示问题

    首先说明一下情况,在MySQL数据库中获取的时间显示在jsp页面中不是按指定格式显示,显示的是类似于这种--Tue Jun 18 00:00:00 CST 2013.而想要的仅仅是年月日而已. 对于这 ...

  2. JSP页面中的指令标识

    JSP页面中的指令标识 制作人:全心全意 指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中.也就是说,指令标识对于客户端浏览器是不可见的 ...

  3. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  4. jsp篇 之 jsp页面中的路径问题

    jsp页面中的路径问题: 一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一 样的,但是在[jsp中可以动态获得该项目的url]. 如果在jsp页面的上面写了这 ...

  5. 使用JDBC向数据库中插入一条数据

    原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...

  6. 方法:查询MongoDB数据库中最新一条数据(JAVA)

    使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...

  7. 数据库一次性插入10w条数据,怎么插入效率快

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量 ...

  8. 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)

    我们常常会用到通过图书的名称来查询图书那么这种话我们也就会使用到从数据库中搜索出数据而且载入到自己的Jsp页面中 这种话我们须要将从数据库中获取到的数据放进响应中然后通过%=request.getAt ...

  9. mysql 数据库查询最后两条数据

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011925175/article/details/24186917  有一个mysql数据库的 ...

随机推荐

  1. 003.ASP.NET Core tutorials--【Asp.net core 教程】

    ASP.NET Core tutorials Asp.net core 教程 2016-10-14 1 分钟阅读时长 本文内容 1.Building web applications 构建web应用 ...

  2. DotNetCore跨平台~文章索引~永久更新

    本索引目录主要包括仓储大叔对dotnet core架构的研究与知识积累,从2016年开始进行撰写,到今天已经有一年多了,其中有一些小知识,小技巧,小应用,希望给大家在开发时一些启发,也希望dotnet ...

  3. ZooKeeper快速学习

    "一入Java深似海",过去自身对于分布式的接触,始终处于使用别人构建的框架的水平,最多就是在nginx配置一下第4层的负载均衡(最后有介绍).随着java使用深入,本文将重点理解 ...

  4. Out of mind - 魔术纸

    魔术纸 显示屏与纸张的完美结合.类似电子墨水.柔性显示器.魔术纸柔软似真正的纸张.用魔术纸做成的电子书,控制器在书轴处. 每一页能显示不同的东西.一本书可以完全按页显示在电子书上.可以换一本书来显示. ...

  5. nopCommerce 3.9 大波浪系列 之 网页加载Widgets插件原理

    一.插件简介 插件用于扩展nopCommerce的功能.nopCommerce有几种类型的插件如:支付.税率.配送方式.小部件等(接口如下图),更多插件可以访问nopCommerce官网. 我们看下后 ...

  6. (转)IBM MQ 创建以及常见问题集锦

    背景:这篇文章还是很全面的,但是很杂乱 后面慢慢整理吧! 1 MQ 消息队列+发送队列+消息通道 接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行 start channle(chlna ...

  7. HDU1124 Factorial

    Problem Description The most important part of a GSM network is so called Base Transceiver Station ( ...

  8. vc++MFC开发上位机程序

    用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...

  9. LoadRunner性能测试-LoadRunner工具安装

    Loadrunner11安装 1,在网上下载loadrunner11安装包 (百度可以下载安装包) 2,打开安装文件,点击setup.exe进行安装: 3,win10系统可能会出现如下问题: 提示管理 ...

  10. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之二

    好了,废话也不多说,咱们直接来看看这款MVC的造型——你可能会大吼:“这……这特么的都是些什么鬼?” 靠,告诉你吧,我也不知道这都是些什么鬼,反正以前我是没有见过这样的MVC.咦,老纸的config文 ...