用java,jsp实现分页操作(图文详解,通俗易懂)

前言

在宿舍躺着,突然觉得 分页操作 综合了很多知识,于是决定写一篇文章来记录分析分页操作,真的会很详细。希望大家可以一起讨论学习。

一、需要掌握的知识

java基础
  • 需要掌握 基础语法面向对象集合泛型 等基础知识
sql基础
  • 学会和掌握sql语法

  • 分页操作需要用到 limit语法

    • 如select *from 表名 limit a,b;

      ​ 表示查询从索引a开始查询往下的b条

jsp基础
  • 需要稍微学一下前端三剑客的基础知识
  • 需要掌握服务器servlethttp方面的知识
  • 需要掌握eljstl的知识
    • 简化了jsp在前端页面的java代码
    • 例如可以直接写${requestScope.(转发的数据名)}可以直接接收转发的数据

当你掌握了以上知识之后,就可以自己完成分页操作了!

但是分页操作如何实现呢?

二、接下来,我们来分析一下分页操作

  • 仔细想想,分页操作是不是就是,当你点开一个页面的时候,此时页面就只显示第一页的内容。需要你点击第二页,你才能查看第二页的内容。而且,每一页都有固定的几条数据或是字数。

  • 当我们学完了如上需要掌握的知识之后。我们一步一步分析。

    • 1.点开jsp页面时,通过servlet类自动查找第一页的固定几条数据。
    • 2.jsp页面有显示页数的按钮。页数由能查找的所有数据控制。
    • 3.点开第二页或第几页时,传输给servlet类当前页数的信息,继续查找当前页数固定几条数据。
  • 当然还有很多细节。

    • 例如传给servlet类时,需要进行数据库操作,需要用到sql的limit语法来实现分页操作。
    • 利用面向对象的思想去实现分页对象等等

三、实现前的准备

创建分页对象
  • 要想把分页操作的数据都存放在分页对象里,就必须要把分页对象的数据类型都分析清楚。

代码如下:

	private int rows;
    /**一页显示有几条数据*/
    private List<E> list;
    /**分页所展示的每条数据*/
    private int currentPage;
    /**当前页数*/
    private int totalCount;
    /**总数*/
    private int totalPage;
    /**总页数*/
  • 要想把这个对象可用作所有数据类型的分页操作,就必须用泛型到类名中
  • 该类名为PageBean
  • 生成所有数据类型的getter和setter方法
创建数据库,并把数据填入,用做测试
  • 我把小a到小z的数据都存入了表中
  • 表数据如下

在这里插入图片描述

数据库连接和关闭的工具类
  • 相信大家都已经会了,就不多写了,重点是写大概思路,要是不会可以私我。
创建Demo对象
  • 根据数据库的信息,创建相应的对象

  • 我这个数据库的数据应该这么创建

  • private String name;
    private int age;
    private int grade;
    
服务器的配置
  • 配置Tomcat服务器。这个要是学到web端都有讲,不会可以私我哦。

四、开始实现分页操作!

别急,一步一步来,首先要写一写jsp。
  • 由于是演示,就随便布置这个页面了。

  • 大概是一个表格显示固定几条数据,下面有一排页数按钮,点开可以跳转指定页数。

    • 表格数据的代码如下

    • <table class="table2">
          <tr>
              <th>编号</th>
              <th>姓名</th>
              <th>年龄</th>
              <th>年级</th>
          </tr>
      
          <c:forEach items="${requestScope.list}" var="list" varStatus="s">
          	<%--增强for循环,循环遍历分页的list的数据--%>
          	
              <tr>
                  <td>${s.count}</td>
                  <td>${list.name}</td>
                  <td>${list.age}</td>
                  <td>${list.grade}</td>
              </tr>
          </c:forEach>
      
      </table>
      
  • 页数按钮需要先得知道有多少页。我们假设有个集合pages存入了所有的页数信息。

  • 于是,我们可以这么写代码

  • <form action="demoServlet">
    <table>
        <tr>
            <c:forEach items="${requestScope.pages}" var="pages" varStatus="s">
            	<td>
                	<button type="submit" name="currentPage" value="${pages}">
                		${pages}
                	</button>
                </td>
            </c:forEach>
        </tr>
    </table>
    </form>
    
    • 解读一下:
      • 先弄一个表单,提交地址为处理操作的servlet。
      • 创建一个表格,在第一行内,使用增强for循环遍历pages。
      • 其中,每一页分别对应着pages的一个数据。
      • 当点击相应的页数时,会把页数转发数据给servlet,可以接收当前页数的数据。
大概写完jsp了,下一步就是完成servlet的操作了!
1.接收当前页面的数据
  • jsp中我们得到了当前页数的数据,所以我们可以利用每页显示的具体条数当前页数来决定这一页显示的数据。

  • 注意,由于我们一开始打开页面要显示第一页的数据,而第一次打开的时候当前页面(currentPage)是空的,会导致服务器出错,所以我们要写一个判断语句,若是空的则为1,,否则就为接收的数据。

  • 代码如下

  • int currentPage;
    
    if (request.getParameter("currentPage") == null){
        currentPage = 1;
    }else {
        /*获取当前页*/
        currentPage = Integer.parseInt(request.getParameter("currentPage"));
    }
    
2.获取并存入信息,设置每页显示的具体条数,并把现在有的数据存入分页对象中
  • 有一类是要进行处理数据库逻辑操作的,我们可以把这一类直接命名为DemoService。这一类是要完成很多操作的,我们要做的是,在这一类中使用一个searchPageDemo的方法,找出分页对象的所有数据,返回分页对象

  • 直接上代码

  • 			//创建demoService对象
    	DemoService demoService = new DemoService();
    	
    			//假设显示的条数设置为5条,即可以直接这么写
    	PageBean<Demo> pageBean = demoService.searchPageDemo(5,currentPage);
    			
    			//把每页显示的数据集合单独拿出来,方便遍历,化简代码
    	List<Demo> list = pageBean.getList();
    	
    			//把页码个数放在pages集合里,方便操作,简化代码
        List<Integer> pages = new ArrayList<>();
    
        for (int i = 1; i <= pageBean.getTotalPage(); i++) {
                pages.add(i);
            }
    
3.最后,把数据转发到jsp上
  • 直接上代码

  • request.setAttribute("list",list);
    request.setAttribute("pageBean",pageBean);
    request.setAttribute("pages",pages);
    
    request.getRequestDispatcher("Demo.jsp").forward(request,response);
    
关键的时候到了,接下来该完成service了!
  • 由前面可以知道,得到的信息是rows(每页显示的具体条数)和currentPage(当前页面),所以service代码要接受这两个数据。
1.先把已经有的数据存到分页对象吧。
pageBean.setRows(rows);
pageBean.setCurrentPage(currentPage);
2.利用demoDao,实现查找数据库的操作。
  • dao层,即为简单的数据库操作。service就是负责把dao相互连接在一起处理复杂的操作。

  • 在demoDao里,我们将创建两个方法,findTotalCount和findPage。

    • findTotalCount意思是查找数据总条数。
    • findPage意思是查找当前页面的所有数据,接收rows和currentPage。
  • 直接上代码

  • pageBean.setList(demoDao.findPage(rows,currentPage));
    pageBean.setTotalCount(demoDao.findTotalCount());
    
3.注意!我们还没有把页码个数存进去。
  • 我们可以利用一个判断语句来存页码个数。

  • 直接上代码,懂得都懂。

  • if ((demoDao.findTotalCount()%rows)==0){
        pageBean.setTotalPage(demoDao.findTotalCount()/rows);
    }else {
        pageBean.setTotalPage((demoDao.findTotalCount()/rows)+1);
    }
    
最后一步!完成dao代码。
首先是findTotalCount
  • 关键就这个了,别的不懂的可以私我。

  • SELECT COUNT(年级) FROM demo
    
最后就是findPage
  • 回顾一下,我们查找sql分页的时候,是利用了limit a,b来实现的。于是我们应该寻找a这个索引和已知量的关系。

  • 直接给答案啦,这个很容易得出的

int index = (currentPage-1)*row ;
  • 再利用setInt方法,把sql语句填上去。

  • 部分代码如下

  • conn = DemoUtils.getConnection();
    int index = (currentPage-1)*row ;
    String sql = "select * from demo limit ?,?";
    pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1,index);
    pstmt.setInt(2,row);
    rs = pstmt.executeQuery();
    while (rs.next()) {
        Demo demo = new Demo();
    
        demo.setName(rs.getString("姓名"));
        demo.setAge(rs.getInt("年龄"));
        demo.setGrade(rs.getInt("年级"));
    
        list.add(demo);
    

完成啦!!

以上便是分页操作的分析和所有步骤。接下来请看测试效果。

首先进入页面是第一页:

在这里插入图片描述

点击第三页和第六页效果分别如下:

在这里插入图片描述

在这里插入图片描述

即分页操作彻底完成。

新人刚学java,以上文章皆为原创。若是有什么不准确的或是有疑问,欢迎评论。求赞求收藏,希望对你有帮助~

有需要源码的或是交流学习可以私我哦

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐