zoukankan      html  css  js  c++  java
  • java中部的分页实现(二)

    大家好,欢迎来到雄雄的小课堂,昨天分享了关于分页查询的理论知识,今天我们就来结合代码和案例实际的应用一下,方便大家理解。

    前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里快速浏览:javaweb中实现分页,持续更新……

    01

    开发环境

    Myeclipse 10.5

    Mysql 5.5

    Tomcat 7.0

    JDK 1.7

    Chrome浏览器

    02

    数据库和表结构:

    下面是表中的测试数据,需要说明的是saddress这一列,本来是当做地址的,现在有其他的需求,就当成了角色使用,但是并不影响分页。

    03

    Javaweb代码

    Java代码是以分层开发的思想来实现的,其中有实体类:Student,Dao类和接口:BaseDaoNew,IStudentDao,Dao层实现类StudentDaoImpl:Service接口和实现类IStudentService,StudentService以及最后的工具类PageUtils

    代码如下

    实体类:Student

    package org.entity;
    
    /**
     * 
     * @author 24519
     * 学生的实体类
     *
     */
    public class Student {
      private   int     sid;
      private   String sname;
      private   String sphone;
      private   String spass;
      private   String saddress;
      private   int     sage;
      
      //封装
      public int getSid() {
        return sid;
      }
      public void setSid(int sid) {
        this.sid = sid;
      }
      public String getSname() {
        return sname;
      }
      public void setSname(String sname) {
        this.sname = sname;
      }
      public String getSphone() {
        return sphone;
      }
      public void setSphone(String sphone) {
        this.sphone = sphone;
      }
      public String getSpass() {
        return spass;
      }
      public void setSpass(String spass) {
        this.spass = spass;
      }
      public String getSaddress() {
        return saddress;
      }
      public void setSaddress(String saddress) {
        this.saddress = saddress;
      }
      public int getSage() {
        return sage;
      }
      public void setSage(int sage) {
        this.sage = sage;
      }
      
      
      
    
    }

    BaseDaoNew:

    package org.dao;
    
    import java.sql.*;
    import java.util.List;
    
    import com.sun.org.glassfish.external.statistics.annotations.Reset;
    
    
    /**
     * 
     * @author 24519
     * 连接数据库的工作类
     *
     */
    public  class BaseDaoNew {
      
      private Connection conn = null;
      private PreparedStatement pre;
      private ResultSet rs;
      //连接数据库
      public Connection getConn(){
        try{
          //加载驱动
          Class.forName("com.mysql.jdbc.Driver");
          //数据库连接字符串
          String url
           = "jdbc:mysql://localhost:3306/schooldb?user=root&password=root";
          //连接数据库
          conn = DriverManager.getConnection(url);
        }catch(Exception ex){
          ex.printStackTrace();
        }
        return conn;
      }
      
      //增删改
      public int ExecuteUpdate(String sql,List params) throws SQLException{
        int rel = 0;
        conn = getConn();
          pre = conn.prepareStatement(sql);
          if(params!=null){
            for(int i = 0;i<params.size();i++){
              pre.setObject(i+1, params.get(i));
            }
          }
          rel = pre.executeUpdate();
        
        return rel;
      }
      
      //查询
      public ResultSet ExecuteQuerty(String sql,List params) throws SQLException{
        conn = getConn();
        pre = conn.prepareStatement(sql);
        if(params!=null){
          for(int i = 0;i<params.size();i++){
            pre.setObject(i+1, params.get(i));
          }
        }
        
        return pre.executeQuery();
        
      }
      
      
      //关闭连接
      public void closeConn(Connection conn,
              PreparedStatement pre,ResultSet rs){
          try {
            if(rs!=null){
              rs.close();
            }
            if(pre!=null){
              pre.close();
            }
            if(conn!=null){
              conn.close();
            }
          } catch (SQLException e) {
            e.printStackTrace();
        }
        
      }
      
      
    
    }

    IStudentDao:

    package org.dao;
    
    import java.util.List;
    
    import org.entity.Student;
    
    //学生信息的接口
    public interface IStudentDao {
    
      //增加学生信息
      public int addStudent(Student stu);
      
      //修改学生信息
      public int updateStudent(Student stu);
      
      //删除学生信息
      public int delStudent(int sid);
      
      //根据编号查询学生信息
      public Student findStudentById(int sid);
      
      //查询全部学生信息
      public List<Student> findStudentAll();
      
      //登录
      public Student login(String name,String pass);
      
      //总记录数
      public int findAllStudentCount();
      
      //分页查询
      public List<Student> findStudentByPage(int currIndex,int pageSize);
    }

    StudentDaoImpl:

    package org.dao.impl;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.dao.BaseDao;
    import org.dao.BaseDaoNew;
    import org.dao.IStudentDao;
    import org.entity.Student;
    
    import com.sun.xml.internal.ws.Closeable;
    
    /**
     * 
     * @author 24519
     * 学生信息的实现类
     *
     */
    public class StudentDaoImpl implements IStudentDao {
    
      BaseDao base = new BaseDao();
      private Connection conn = base.getConn();
      PreparedStatement pre = null;
      ResultSet rs = null;
      
      @Override
      public int addStudent(Student stu) {
        int rel = 0;
        String sql = "insert into Student values(?,?,?,?,?,?);";
        try {
          List<Object> params = new ArrayList<Object>();
          params.add(stu.getSid());
          params.add(stu.getSname());
          params.add(stu.getSphone());
          params.add(stu.getSpass());
          params.add(stu.getSaddress());
          params.add(stu.getSage());
          rel = base.ExecuteUpdate(sql, params);
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        return rel;
      }
    
      @Override
      public int updateStudent(Student stu) {
        String sql = "update student set sname = ?," +
            "sphone = ?,spass=?,saddress=?,sage=? where sid = ?";
        int rel = 0;
        try {
          List<Object> params = new ArrayList<Object>();
          params.add(stu.getSname());
          params.add(stu.getSphone());
          params.add(stu.getSpass());
          params.add(stu.getSaddress());
          params.add(stu.getSage());
          params.add(stu.getSid());
          rel = base.ExecuteUpdate(sql, params);
          
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return rel;
      }
    
      @Override
      public int delStudent(int sid) {
        String sql = "delete from Student where sid = ?";
        int rel = 0;
        try {
          List<Object> params = new ArrayList<Object>();
          params.add(sid);
          rel = base.ExecuteUpdate(sql, params);
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        return rel;
      }
    
      @Override
      public Student findStudentById(int sid) {
        Student student = new Student();
        String sql = "select * from student where sid = ?";
        try {
          List<Object> params = new ArrayList<Object>();
          params.add(sid);
          rs = base.ExecuteQuery(sql, params);
          while(rs.next()){
            student.setSid(rs.getInt(1));
            student.setSname(rs.getString(2));
            student.setSphone(rs.getString(3));
            student.setSpass(rs.getString(4));
            student.setSaddress(rs.getString("saddress"));
            student.setSage(rs.getInt(6));
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
         return student;
      }
    
      @Override
      public List<Student> findStudentAll() {
        List<Student> stus = new ArrayList<Student>();
        String sql = "select * from Student";
        try {
          rs = base.ExecuteQuery(sql, null);
          while(rs.next()){
            Student student = new Student();
            student.setSid(rs.getInt(1));
            student.setSname(rs.getString(2));
            student.setSphone(rs.getString(3));
            student.setSpass(rs.getString(4));
            student.setSaddress(rs.getString(5));
            student.setSage(rs.getInt(6));
            stus.add(student);//将信息放入集合中
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return stus;
      }
    
      //登陆
      @Override
      public Student login(String name, String pass) {
        Student student = new Student();
        String sql = "select * from student where sname = ? and spass = ?;";
        try {
          List<Object> params = new ArrayList<Object>();
          params.add(name);
          params.add(pass);
          rs = base.ExecuteQuery(sql, params);
          while(rs.next()){
            student.setSid(rs.getInt(1));
            student.setSname(rs.getString(2));
            student.setSphone(rs.getString(3));
            student.setSpass(rs.getString(4));
            student.setSaddress(rs.getString(5));
            student.setSage(rs.getInt(6));
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }
        
        return student;
      }
    
      //查询总记录数
      @Override
      public int findAllStudentCount() {
        String sql = "select count(*) from student";
        int count = 0;
        try {
          rs = base.ExecuteQuery(sql, null);
          rs.next();
          count = rs.getInt(1);
          
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return count;
      }
      
      //分页查询
      @Override
      public List<Student> findStudentByPage(int currIndex, int pageSize) {
        String sql = "select * from student limit ? ,?";
        int one = (currIndex-1)*pageSize;
        List<Object> params = new ArrayList<Object>();
        params.add(one);
        params.add(pageSize);
        List<Student> sList = new ArrayList<Student>();
        try {
          rs = base.ExecuteQuery(sql, params);
          while(rs.next()){
            Student stu = new Student();
            stu.setSid(rs.getInt(1));
            stu.setSname(rs.getString(2));
            stu.setSphone(rs.getString(3));
            stu.setSpass(rs.getString(4));
            stu.setSaddress(rs.getString(5));
            stu.setSage(rs.getInt(6));
            sList.add(stu);
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return sList;
      }
    
    }

    IStudentService:

    package org.service;
    
    import java.util.List;
    
    import org.entity.Student;
    
    public interface IStudentService {
    
      //增加学生信息
      public int addStudent(Student stu);
      
      //修改学生信息
      public int updateStudent(Student stu);
      
      //删除学生信息
      public int delStudent(int sid);
      
      //根据编号查询学生信息
      public Student findStudentById(int sid);
      
      //查询全部学生信息
      public List<Student> findStudentAll();
      
      //登录
      public Student login(String name,String pass);
      
      //计算总记录数
      public int findAllStudentCount();
      
      //分页查询
      public List<Student> findStudentByPage(int currIndex,int pageSize);
    
    }

    StudentService:

    package org.service.impl;
    
    import java.util.List;
    
    import org.dao.IStudentDao;
    import org.dao.impl.StudentDaoImpl;
    import org.entity.Student;
    import org.service.IStudentService;
    
    public class StudentServiceImpl implements IStudentService {
    
      //创建Dao层的对象
      private IStudentDao sDao = new StudentDaoImpl();
      
      
      @Override
      public int addStudent(Student stu) {
        return sDao.addStudent(stu);
      }
    
      @Override
      public int updateStudent(Student stu) {
        return sDao.updateStudent(stu);
      }
    
      @Override
      public int delStudent(int sid) {
        return sDao.delStudent(sid);
      }
    
      @Override
      public Student findStudentById(int sid) {
        return sDao.findStudentById(sid);
      }
    
      @Override
      public List<Student> findStudentAll() {
        return sDao.findStudentAll();
      }
    
      @Override
      public Student login(String name, String pass) {
        return sDao.login(name, pass);
      }
    
      @Override
      public int findAllStudentCount() {
        return sDao.findAllStudentCount();
      }
    
      //分页查询
      @Override
      public List<Student> findStudentByPage(int currIndex, int pageSize) {
        return sDao.findStudentByPage(currIndex, pageSize);
      }
      
    
    }

    PageUtils:

    package org.utils;
    
    import java.util.List;
    
    import org.entity.Student;
    
    /**
     * 
     * @author 24519
     * 分页的工具类
     *
     */
    public class PageUtils {
      //页大小(每页显示多少条记录)
      private int pageSize;
      //当前页
      private int currIndex;
      //总记录数
      private int totalCount;
      //总页数
      private int totalPage;
      //每页显示的数据
      List<Student> sList;
      
      
      public int getPageSize() {
        return pageSize;
      }
      public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
      }
      public int getCurrIndex() {
        return currIndex;
      }
      //设置当前页
      public void setCurrIndex(int currIndex) {
        //判断当前页是否小于0,如果是,则默认第一页
        if(currIndex<=0){
          this.currIndex = 1;
        }else{
          this.currIndex = currIndex;
        }
      }
      
      
      public int getTotalCount() {
        return totalCount;
      }
      //计算总页数
      public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        int pages = totalCount%pageSize==0
                ?totalCount/pageSize
                  :totalCount/pageSize+1;
        totalPage = pages;
      }
      
      
      public int getTotalPage() {
        return totalPage;
      }
      public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
      }
      
      
      public List<Student> getsList() {
        return sList;
      }
      public void setsList(List<Student> sList) {
        this.sList = sList;
      }
      
     
    }

    代码解析:我们可以看到,在IStudentDao中,除了有增删改和登录的接口外,还有两个接口,一个是查询总记录数,另一个为分页查询数据.

    //总记录数
      public int findAllStudentCount();
      
      //分页查询
      public List<Student> findStudentByPage(int currIndex,int pageSize);

    总记录数的作用就是对总页数进行计算,公式为,总页数=总记录数%页大小==0?总记录数/页大小:总记录数/页大小+1;

    分页查询的数据,由于是多条,即返回List<Student>集合,每页显示5条数据,那我们就查询5条,即参数pageSize的值为5。currIndex的作用是用来记录当前页。

    实现类对于这两个接口的关键代码如下:

    //查询总记录数
      @Override
      public int findAllStudentCount() {
        String sql = "select count(*) from student";
        int count = 0;
        try {
          rs = base.ExecuteQuery(sql, null);
          rs.next();
          count = rs.getInt(1);
          
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return count;
      }
      
      //分页查询
      @Override
      public List<Student> findStudentByPage(int currIndex, int pageSize) {
        String sql = "select * from student limit ? ,?";
        int one = (currIndex-1)*pageSize;
        List<Object> params = new ArrayList<Object>();
        params.add(one);
        params.add(pageSize);
        List<Student> sList = new ArrayList<Student>();
        try {
          rs = base.ExecuteQuery(sql, params);
          while(rs.next()){
            Student stu = new Student();
            stu.setSid(rs.getInt(1));
            stu.setSname(rs.getString(2));
            stu.setSphone(rs.getString(3));
            stu.setSpass(rs.getString(4));
            stu.setSaddress(rs.getString(5));
            stu.setSage(rs.getInt(6));
            sList.add(stu);
          }
        } catch (SQLException e) {
          e.printStackTrace();
        }finally{
          base.closeConn(conn, pre, rs);
        }
        
        return sList;
      }

    PageUtils类的我们需要注意,在设置当前页currIndex的值时,要对齐进行判断,因为当前页永远永远的不可能小于0 或者大于总页数,设置的关键代码如下:

    //设置当前页
      public void setCurrIndex(int currIndex) {
        //判断当前页是否小于0,如果是,则默认第一页
        if(currIndex<=0){
          this.currIndex = 1;
        }else{
          this.currIndex = currIndex;
        }
      }

    设置总记录数的关键代码如下:顺便对总页数进行计算

    //计算总页数
      public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        int pages = totalCount%pageSize==0
                ?totalCount/pageSize
                  :totalCount/pageSize+1;
        totalPage = pages;
      }

    接下来就可以在表现层进行分页,我们在进分页查询的页面之前,先进doPage.jsp对数据进行处理,将所有需要用到的分页数据全部封装至PageUtils类中,完整实现代码如下:各个关键步骤均有注释

    <%@page import="org.entity.Student"%>
    <%@page import="org.service.impl.StudentServiceImpl"%>
    <%@page import="org.service.IStudentService"%>
    <%@page import="org.utils.PageUtils"%>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
      Student stu = (Student) request.getAttribute("student");
      //判断是否是管理员
      if (stu.getSaddress().equals("管理员")) {
        //获取当前页,
        //如果是空,默认是1
        String curr = request.getParameter("currIndex");
        if (curr == null) {
          curr = "1";
        }
        Integer currIndex = Integer.parseInt(curr);
    
        PageUtils p = new PageUtils();
        p.setPageSize(5);
        //计算总记录数
        IStudentService s = new StudentServiceImpl();
        //从数据库中查询总记录数
        p.setTotalCount(s.findAllStudentCount());
    
        //如果当前页大于等于总页数,那当前页就是总页数
        if (currIndex >= p.getTotalPage()) {
          currIndex = p.getTotalPage();
        } else if (currIndex <= 0) {
          //如果当前页小于等于0,则当前页等于1
          currIndex = 1;
        }
        p.setCurrIndex(currIndex);
    
        //从数据库中查询每页显示的数据放在集合中
        List<Student> sList = s.findStudentByPage(currIndex, 5);
        p.setsList(sList);
        //将p对象放在request作用域中,在请求的页面中获取
        request.setAttribute("p", p);
        //跳转到分页的页面
        request.getRequestDispatcher("findStudentPage.jsp").forward(
            request, response);
    
      } else {
        //普通员工
        //跳转到查询自己信息的页面
        request.setAttribute("stu", stu);
        request.getRequestDispatcher("shouInfo.jsp").forward(request,
            response);
      }
    %>

    注意看这一行代码,当我们将一切处理完之后,通过这行代码转发至分页显示信息的页面,

    request.getRequestDispatcher("findStudentPage.jsp").forward(request, response);

    下面就是分页显示数据的页面了:

    <%@page import="org.utils.PageUtils"%>
    <%@page import="org.entity.Student"%>
    <%@page import="org.service.impl.StudentServiceImpl"%>
    <%@page import="org.service.IStudentService"%>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'FindStudentPage.jsp' starting page</title>
        
      <meta http-equiv="pragma" content="no-cache">
      <meta http-equiv="cache-control" content="no-cache">
      <meta http-equiv="expires" content="0"> 
      <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
      <meta http-equiv="description" content="This is my page">
      <!--
      <link rel="stylesheet" type="text/css" href="styles.css">
      -->
    
      </head>
      
      <body>
          <%
              //获取所有的数据
              PageUtils p = (PageUtils)request.getAttribute("p");
              //从工具类中获取每页显示的数据
              List<Student> sList =p.getsList() ;
           %>
           <table border="1">
      <tr>
        <td>编号</td>
        <td>姓名</td>
        <td>电话</td>
        <td>密码</td>
        <td>地址</td>
        <td>年龄</td>
      </tr>
      
      <%
        for(Student stu :sList){
      %>
      <tr>
        <td><%=stu.getSid() %></td>
        <td><%=stu.getSname() %></td>
        <td><%=stu.getSphone() %></td>
        <td><%=stu.getSpass() %></td>
        <td><%=stu.getSaddress()%></td>
        <td><%=stu.getSage() %></td>
      </tr>
      <%
        }
       %>
    </table>
            <a href="doPage.jsp?currIndex=1">首页</a>
        <a href="doPage.jsp?currIndex=<%=p.getCurrIndex()-1%>">上一页</a>
        <%=p.getCurrIndex()%> / <%=p.getTotalPage()%>
        <a href="doPage.jsp?currIndex=<%=p.getCurrIndex()+1%>">下一页</a>
        <a href="doPage.jsp?currIndex=<%=p.getTotalPage()%>">末页</a>
          <br/>
          <form action="doPage.jsp" method="post">
          至
            <input type="number" max="<%=p.getTotalPage() %>" min="1" value="<%=p.getCurrIndex() %>" style="display:inline-block; 50px" name="currIndex"/>
            页
            <input type="submit" value="跳转">
          </form>
      </body>
    </html>

    代码解析:

    先从request中获取doPage.jsp中放入的数据,然后以表格的形式展示出来。

    04

    翻页解析

    首页,很简单,当前页码必定是1,所以直接写currIndex=1即可。

    上一页,假如当前也是2,那么上一页就是当前也减去1,所以上一页就是currIndex-1。

    下一页,正好和上一页相反,即currIndex+1。

    尾页,假如一共有5页,那么尾页就是5,即currIndex=5。

    当前页和总页数由于我们在doPage都放在了PageUtils中,所以直接从PageUtils中获取即可。

    注意我们无论是点击上一页还是下一页,或者首页尾页,均是跳转至doPage.jsp中操作,在doPage.jsp中,直接获取currIndex的值,然后在调用Service里面的方法进行分页查询。

    运行结果如下:

    往期精彩

    javaweb中实现分页,持续更新……

    2020-11-24

    一个简单的分页工具类

    2020-11-23

    javaWeb中,如何通过Commons-FileUpload组件上传文件

    2020-11-22

    多功能语音播放器

    2020-11-21

    CSS动画示例(上一篇是CSS过渡…)

    2020-11-20

    CSS3中的动画示例

    2020-11-19

    点分享

    点点赞

    点在看

  • 相关阅读:
    【NYOJ】[22]素数求和问题
    【NYOJ】[13]Fibonacci数
    【NYOJ】[13]Fibonacci数
    【CodeForces】[606A]Magic Spheres
    【CodeForces】[606A]Magic Spheres
    【杭电】[1201]18岁生日
    【杭电】[1201]18岁生日
    【杭电】[1994]利息计算
    【杭电】[1994]利息计算
    新型量子云装置问世 让你免费体验量子计算机
  • 原文地址:https://www.cnblogs.com/a1111/p/14877356.html
Copyright © 2011-2022 走看看