美文网首页从零学Java笔录
JavaWeb学习-案例练习-图书管理后台- 9 -分页操

JavaWeb学习-案例练习-图书管理后台- 9 -分页操

作者: 凯哥Java | 来源:发表于2019-07-06 10:18 被阅读0次

    前面一篇完成了多条件的查询,这篇开始学习分页,很多网页是默认显示20条数据,想看更多数据,就通过点击下一页的方式实现。这篇就来模拟这个分页实现过程。

    1. 项目环境准备

    之前我们实现的都是图书管理后台功能,现在分页,我们在前端页面,所以我把素材中product_list.jsp和ad文件夹拷贝到Eclipse中的WebContent的目录下。product_list.jsp就是我们要实现分页的前端页面。

    上图是项目工程结构,全部代码放在了github上。

    https://github.com/Anthonyliu86/BookManagement_JavawebDemo

    2. 分页思路分析

    当前product_list的效果是这样,布局是采用表格布局,一行显示四本书,也就是一个tr里面有4个td。

    为了我们简单,这里我们只用一行,每行显示4本书,想看第五本书,必须点击下一页菜单。所以,我们在product_list.jsp中这个表格,只留下一个tr,第一行也只留下一个td,也就是一本书,最后效果是这样的

    下图是所有层交互的思路。

    3. 分页代码实现过程

    在点击下一页之后,这个动作需要跳转到一个servlet,我们先来创建这个servlet,叫pageServlet。

    3.1 创建一个PageServlet.java

    当前这个servlet代码是空,这个文件主要写设置每页显示个数,和当前页id获取,然后返回一个页面对象。所以,我们先创建一个关于页面的Bean类。

    3.2 创建PageBean.java

    在domian包下创建一个PageBean.java文件,写入下面代码。

    import java.util.List;

    public class PageBean {

    private int pageSize;

    private int currentPage;

    private int count;

    private int totalPage;

    private List books;

    public int getPageSize() {

    return pageSize;

    }

    public void setPageSize(int pageSize) {

    this.pageSize = pageSize;

    }

    public int getCurrentPage() {

    return currentPage;

    }

    public void setCurrentPage(int currentPage) {

    this.currentPage = currentPage;

    }

    public int getCount() {

    return count;

    }

    public void setCount(int count) {

    this.count = count;

    }

    3.3 Dao层代码

    在BookDao这个接口中新增两个方法,一个是求总记录数,第二个是查找分页数据

    /**

    * 得到总记录数

    * @return

    * @throws SQLException

    */

    public int count() throws SQLException;

    /**

    * 查找分页数据

    * @param currentPage

    * @param pageSize

    * @return

    * @throws SQLException

    */

    public List findBooks(int currentPage, int pageSize)throws SQLException;

    然后在BookDaoImpl.java添加这两个方法的具体实现代码。

    public int count() throws SQLException {

    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());

    long l = (Long)qr.query("select count(*) from book", new ScalarHandler(1));

    return (int)l;

    }

    public List findBooks(int currentPage, int pageSize) throws SQLException {

    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());

    return qr.query("select * from book limit ?,?", new BeanListHandler(Book.class),(currentPage-1)*pageSize, pageSize);

    }

    3.4 Service层

    BookService接口添加根据currentPage和pageSize两个参数,得到PageBean的方法。

    /**

    * 得到总记录数

    * @return

    * @throws SQLException

    */

    public int count() throws SQLException;

    /**

    * 查找分页数据

    * @param currentPage

    * @param pageSize

    * @return

    * @throws SQLException

    */

    public List findBooks(int currentPage, int pageSize)throws SQLException;

    具体方法实现,添加到BookServiceImpl.java中

    public PageBean findBooksPage(int currentPage, int pageSize) {

    try {

    int count = bd.count();

    int totalPage = (int)Math.ceil(count*1.0/pageSize);

    List books = bd.findBooks(currentPage, pageSize);

    //封装成一个PageBean对象

    PageBean pb = new PageBean();

    pb.setBooks(books);

    pb.setCount(count);

    pb.setCurrentPage(currentPage);

    pb.setTotalPage(totalPage);

    pb.setPageSize(pageSize);

    return pb;

    } catch (SQLException e) {

    e.printStackTrace();

    }

    return null;

    }

    3.5 Servlet代码

    回到PageServlet.java中,看看这个servlet如何写。

    package com.anthony.web.servlet;

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import com.anthony.domain.PageBean;

    import com.anthony.service.BookService;

    import com.anthony.service.BookServiceImpl;

    public class PageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //初始化每页显示记录数

    int pageSize = 4;

    int currentPage = 1; //表示当前页

    String currPage = request.getParameter("currentPage");

    if(currPage != null) { //第一次访问页面currPage可能为null

    currentPage = Integer.parseInt(currPage);

    }

    //调用业务层方法

    BookService bs = new BookServiceImpl();

    //分页查询,并返回PageBean对象

    PageBean pb = bs.findBooksPage(currentPage, pageSize);

    //请求跳转

    request.setAttribute("pb", pb);

    request.getRequestDispatcher("/product_list.jsp").forward(request, response);

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    doGet(request, response);

    }

    }

    3.6 Product_list.jsp修改

    3.6.1 添加JSTL约束

    在product_list.jsp顶部添加JSTL约束。

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    3.6.2 解析PageBean对象到jsp中

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    bookStore列表

    <%--导入css --%>

    首页    >    计算机    >    图书列表

    商品目录

    计算机

        共100种商品

    border="0" /> 

    书名:${b.name}售价:${b.price} 

      <<上一页

    • 第1页/共5页
    • <<下一页

      浏览器打开https://localhost:8080/BookManagement/pageServlet效果是这样的

      3.6.3 实现上一页和下一页功能

      现在我们就差上一页和下一页这个功能没有实现。

      下面代码主要看 上一页 和下一页中代码。

      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

      bookStore列表

      <%--导入css --%>

      首页    >    计算机    >    图书列表

      商品目录

      计算机

          共100种商品

      border="0" /> 

      书名:${b.name}售价:${b.price} 

        <<上一页

      • 第${pb.currentPage}页/共${pb.totalPage}页
      • <<下一页

        效果如下

        当前还是有一个问题,上一页和下一页都可以一直点击下去,没有做边界处理。

        3.6.4 上一页和下一页边界处理

        因为需要对上一页和下一页的边界判断,例如上一页边界情况,如果当前currentPage等于1,那么就上一页不能再减1。同样,当前currentPage等于totalPage,那么不能加1. 这种if判断,我们可以用三元运算符来一行代码搞定。

        如果currentPage=1, 前端点击上一页,永远传递currentPage=1, 如果currentPage=totalPage,那么传递就是currentPage=totalPage,也就是最后一页。

          <<上一页

        • 第${pb.currentPage}页/共${pb.totalPage}页
        • <<下一页

          到这里,分页操作完成。

          本文来源:www.kaigejava.com

          凯哥公众号:凯哥Java

          相关文章

            网友评论

              本文标题:JavaWeb学习-案例练习-图书管理后台- 9 -分页操

              本文链接:https://www.haomeiwen.com/subject/tltuhctx.html