Servlet实现分页

目录

为什么要使用分页去显示数据?

思路

实现效果

步骤

(1)创建PageUntil分页工具类

(2)声明对应的属性进行封装

(3)计算数据可以显示的总页数

(4)获取页码数据记录

问题

(5)servlet填充对象内容

Service层根据参数查找数据

Dao层访问数据库

(6)设置页面

为什么要使用分页去显示数据?

  当我们在浏览器看一堆很长的列表时,滚动条一滑动,很容易找不到位置,当数据量庞大时,数据库的加载和浏览器解析请求时变的很慢。

思路

  1. 确定每页需要的数据数量。
  2. 计算数据可以显示的总页数
  3. 实现获取指定页码的数据记录

实现效果

步骤

(1)创建PageUntil分页工具类

Constats类用来存放常量,固定不变的值,如每页的数据量

(2)声明对应的属性进行封装

 //当前页数
    private int pageIndex;
    //每页数据量
    private int pageSize = Constats.PAGE_SIZE;
    //总数据量
    private int pageTotalCount;
    //总页数
    private int pageTotal;
    //存储列表分页数据
    private List<T> listdata;

    public List<T> getListdata() {
        return listdata;
    }

    public void setListdata(List<T> listdata) {
        this.listdata = listdata;
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageTotalCount() {
        return pageTotalCount;
    }

    public void setPageTotalCount(int pageTotalCount) {
         this.pageTotalCount=pageTotalCount;
    }

    public int getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(int pageTotal) {
        this.pageTotal = pageTotal;
    }

(3)计算数据可以显示的总页数

  
 public void setPageTotalCount(int pageTotalCount) {
         //当设置总数据量时,计算总页数=总数据量/每页数据量
        if (pageTotalCount % pageSize == 0) {
            //当总数据量可以除尽: 是偶数时
            pageTotal = pageTotalCount / pageSize;
        } else {
            //当总数据量除不尽,可能有余数(总页数+1)
            pageTotal = pageTotalCount / pageSize + 1;
        }
    }

更改pageTotalCount的set方法,当获得总数据量时,可以根据总数据量/每页数据量,计算出总页数。

(4)获取页码数据记录

    即使要分页,每一个都不一样,那么怎么对应sql语句去查询不同的语句呢?

select * from student LIMIT 0,5;  //根据LIMIT分页查询  前五行

select * from student LIMIT 5,5;  //忽略前五行,查找五行

问题

-LIMIT前面的参数是忽略几行开始查,我们在数据库中每一页LIMIT前面的参数都会变化,那怎么去计算呢?我们可以根据当前页数的变化去计算忽略行数

select * from student LIMIT pageIndex=(pageIndex-1)*5,5;  

(5)servlet填充对象内容

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws 
  ServletException, IOException {
    PageUntil<Student> pageUntil = new PageUntil<>();
    //获取总数据量
    int pageTotal = service.selectPageTotal();
    pageUntil.setPageTotalCount(pageTotal);
    //当前页数由前台去获取
    String pageIndex = req.getParameter("pageIndex");
    if (pageIndex == null) {
          pageIndex = "1";
      }

    //当前页数赋给set
    pageUntil.setPageIndex(Integer.parseInt(pageIndex));
    //当前页数和每页数据量去查找数据
    listStudentsPage = service.listStudentByPage(pageUntil.getPageIndex(), 
    pageUntil.getPageSize());
    //将查找的数据存放在集合里
    pageUntil.setListdata(listStudentsPage);
    req.setAttribute("pageUtil", pageUntil);

}    

selectPageTotal()方法获取总数据量根据sql语句返回总行数即可,这里就不写了

Service层根据参数查找数据

 public List<Student> listStudentByPage(int pageIndex, int pageSize) {
        return studentDao.listStudentsByPage((pageIndex-1)*5,pageSize);
    }

Dao层访问数据库

 public List<Student> listStudentsByPage(int pageIndex, int pageSize) {
        Connection con=getConnection();
        PreparedStatement pres=null;
        ResultSet rs=null;
        List<Student> students=null;
        String sql="select * from student LIMIT ?,?";
        try {
            pres=con.prepareStatement(sql);
            pres.setInt(1,pageIndex);
            pres.setInt(2,pageSize);
            rs=pres.executeQuery();
            students=new ArrayList<>();
            while(rs.next())
            {
                Student stu=new Student();
                stu.setId(rs.getInt("id"));
                stu.setName(rs.getString("name"));
                stu.setAge(rs.getInt("age"));
                stu.setGender(rs.getString("gender"));
                stu.setPhone(rs.getString("phone"));
                stu.setAddress(rs.getString("address"));
                students.add(stu);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            closeConnection(rs,pres,con);
        }
        return students;
    }

(6)设置页面

当我们后台处理完毕后,当前页数和具体操作都需要靠前台来设置。

 <div>
     <a href="/Student?op=list&pageIndex=1">首页</a>&nbsp; &nbsp;
     <a href="/Student?op=list&pageIndex=${pageUtil.pageIndex-1<1?pageUtil.pageIndex:pageUtil.pageIndex-1}">上一页</a>&nbsp; &nbsp;
     <a href="/Student?op=list&pageIndex=${pageUtil.pageIndex+1>pageUtil.pageTotal?pageUtil.pageIndex:pageUtil.pageIndex+1}">下一页</a>&nbsp; &nbsp;

     <a href="/Student?op=list&pageIndex=${pageUtil.pageTotal}">尾页</a>&nbsp; &nbsp;
            当前第 <strong>${pageUtil.pageIndex}</strong>页,共有 <strong>${pageUtil.pageTotal}</strong>页
 </div>

启动Servlet的地址自己设置即可,我用的是Student?op=list

注意: 当上一页已经到头了,继续点的时候我们会利用三目运算符做一个判断,如果当前页数小于1的话,就停留在当前页,否则就继续-1,下一页到头的设置同理。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单从表现层来说分页不是一个复杂的工作,稍微理一下思路,处于不同competence level的同学应该都能自己搞出来。 以上面的文章列表分页为例,我觉得分页有两点重要的, 一是:分页我们必须首先自己搞清楚,文章总数、每页显示文章数(页大小)、页数 二是:如何做好页脚的分页导航条 实际应用中,文章总数这个值我们从数据库可以得到;每页显示的文章数即分页的页大小可以自己定义;页数我们可以通过下面的个表达式简单得出。 假设: int pageSize = 10; //分页大小 int totalPosts = PagingDAO.entryList.size(); //总文章数 int totalPages = totalPosts/pageSize + ((totalPosts%pageSize)>0?1:0); //计算得出的总页数 每页的文章怎么取出来? 知道分页的大小之后,我们生成了页好的选取下拉框,每次选择第几页的时候,都会向Servlet传递当前选择页号的参数,这样Servlet调用后面的DAO相应的方法,取得文章列表信息,再回传到JSP以供显示。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> page Size : ${pageSize} <br /> Total Posts: ${totalPosts} <br /> Total Pages: ${totalPages} <br /> Current Page: ${pageNumber} <hr /> <table> <thead> <tr align="center"> <td width="10%">Article ID</td> <td width="70%">Article Title</td> <td colspan="3">Actions</td> </tr> </thead> <tbody> <c:forEach items="${entryList}" var="entry"> <tr align="center"> <td>${entry.entryID}</td> <td>${entry.title}</td> <td><a href="viewEntry?entryID=${entry.entryID}">View</a></td> <td><a href="editEntry?entryID=${entry.entryID}">Edit</a></td> <td><a href="deleteEntry?entryID=${entry.entryID}">Delete</a></td> </tr> </c:forEach> </tbody> <tfoot> <tr align="center"> <td colspan="5"> <jsp:include page="paging_footer.jsp"></jsp:include> </td> </tr> </tfoot> </table> <hr/>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值