首页 > 技术文章 > javaweb分页查询实现

best-hym 2020-02-03 16:00 原文

分页显示对于数据在页面中的展示是非常重要的工具,当数据条数较多时,就需要使用分页来显示。实现分页显示的思路包括:

  1. 确定数据库中一共有多少条数据,即数据总数;
  2. 设定每页准备显示多少条数据,计算出一共需要分多少页,即分页数目=数据总数/每页数目,当数据总数能被每页数目整除时,就正好那么多页;当不能整除时就要在分页数目上再加上一页;
  3. 有了数据总数,每页数据条数、分页数目后,开始使用数据库查询出每页的数据,然后传递给Servlet处理,接着在视图层显示。
  4. 其中数据总数通过数据库查询获得,每页显示数据条数,需要直接给定值,获取每页的数据使用sql语句的"select * from user order by ID desc limit 每页数目*当前页数,每页数目", 包括两个变量:每页数目,这是可以直接赋值的,当前页数,则需要从前端jsp页面获取才行。

 

下面以一个实例,说明分页显示实现过程:

(1)先保证数据库里的表数据条目较多,比如本案例中学生用户表一共8个用户数据,每页显示3条,因此这里就需要3页显示。每页数目=3;数据总数则需要查询获取。

(2)新建两个实体:User和Page,User用于学生对象,Page用于分页对象。

 package com.student.entity;
 
 public class User {
     private int ID;
     private String Name;
     private String Sex;
 
     public User(int iD) {
         this.ID = iD;
     }
 
     public User(int iD, String name, String sex) {
         this.ID = iD;
         this.Name = name;
         this.Sex = sex;
     }
 
     public int getID() {
         return ID;
     }
 
     public void setID(int iD) {
         ID = iD;
     }
 
     public String getName() {
         return Name;
     }
 
     public void setName(String name) {
         Name = name;
     }
 
     public String getSex() {
         return Sex;
     }
 
     public void setSex(String sex) {
         Sex = sex;
     }
 }

 

 package com.student.entity;
 
 public class Page {
     private int pageSize;
     private int totalPage;
     private int Index;
 
     public int getPageSize() {
         return pageSize;
     }
 
     public void setPageSize(int pageSize) {
         this.pageSize = pageSize;
     }
 
     public int getTotalPage() {
         return totalPage;
     }
 
     public void setTotalPage(int totalPage) {
         this.totalPage = totalPage;
     }
 
     public int getIndex() {
         return Index;
     }
 
     public void setIndex(int index) {
         this.Index = index;
     }
 
     public Page() {
         super();
     }
 
     public Page(int Index, int pageSize) {
         this.Index = Index;
         this.pageSize = pageSize;
     }
 }

 

(3)根据需求编写学生用户、分页接口及其实现类,习惯上接口命名为IName,实现类命名为NameImpl

分页接口类:

1 package com.student.dao;
2 
3 public interface IpageDao {
4     public int getTotalPage(int pageSize);
5 }

 

分页实现类:

 package com.student.dao;
 
 import java.sql.SQLException;
 
 public class PageDaoImpl implements IpageDao {
     @Override
     public int getTotalPage(int pageSize) { // 总共多少页数
         DButil db = new DButil();
         int total = 0, totalPage = 0;
         String sql = "select count(ID) from user";
         try {
             total = db.getTotalCount(sql); // 总数
             totalPage = total % pageSize > 0 ? total / pageSize + 1 : total / pageSize; // 总页数
 
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } // 总数量
 
         return totalPage;
     }
 }

 

用户接口类:

 package com.student.dao;
 
 import java.util.List;

 import org.student.entity.Page;
 import org.student.entity.User;
 
 public interface IUser {
     public List<User> queryUserByPage(Page page);
 }

 

用户实现类,实现分页查询获得每页的数据,关键参数给定就是当前页数和每页数目:

package com.student.dao;
 
 import java.sql.*;
 import java.util.*;
 import org.student.entity.Page;
 import org.student.entity.User;
 
 public class UserDaoImpl implements IUser {
     public Connection con = null;
     public PreparedStatement pst = null;
     public Statement sm = null;
     public ResultSet rs = null;
 
     @Override
     public List<User> queryUserByPage(Page page) throws SQLException {
         List<User> arr = new ArrayList();
         DButil db = new DButil(); // 实例化数据库db
         try {
             con = db.initConnection(); // 连接数据库
             String sql1 = "select * from user limit ?,? "; // 分页查询
             pst = con.prepareStatement(sql1);
             pst.setInt(1, page.getIndex() * page.getPageSize()); // 当前页*每页数目
             pst.setInt(2, page.getPageSize());// 每页数目
             rs = pst.executeQuery();
             while (rs.next()) {
                 User stu = new User(rs.getInt(1), rs.getString(2), rs.getString(3));// 查询数据存到user对象
                 arr.add(stu);// 存成List集合
             }
         } catch (ClassNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         db.close();// 关闭数据库
         return arr;
     }
 }

 

(4)userPageServlet代码

 @WebServlet("/userPageServlet" )
 public class userPageServlet extends HttpServlet { 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doPost(request,response);
     }
  
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           request.setCharacterEncoding("UTF-8");
           System.out.println("welcome");
           //获取当前页数,首次进入时start为0,点击超链接时获取start页数
           int start=request.getParameter("start")==null?0:Integer.parseInt(request.getParameter("start"));
           //通过page实现类获得总页数,这里的3为每页数目
           int pageSize=3;
           PageDaoImpl pg=new PageDaoImpl();
           int totalPage=pg.getTotalPage(pageSize); 
           //前一页页数、后一页变量值
           int prePage=start-1>0?start-1:start+1;
           int nextPage=start+1<totalPage?start+1:totalPage-1;
           //使用request.setAttribute方法便于页面中使用el语法
           request.setAttribute("totalPage", totalPage);
           request.setAttribute("prePage", prePage); 
           request.setAttribute("nextPage", nextPage);
           //获得当前页的数据
           Page pg1=new Page(start,pageSize); 
           UserDaoImpl user=new UserDaoImpl();
           try {
             List<User> currentUser=(List<User>)user.queryUserByPage(pg1);
              request.setAttribute("userList", currentUser);
              request.getRequestDispatcher("userPage.jsp").forward(request, response);
            } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
           }      
     }
 }

 

(6)前段jsp代码

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8" import="java.util.*"
     import="com.student.entity.User" import="com.student.entity.Page"%>
 
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <h4>所有用户列表</h4>
     <table border="1" width="60%">
         <tr>
             <td>用户姓名</td>
             <td>用户性别</td>
             <td>操作</td>
         </tr>
         <%
             request.setCharacterEncoding("UTF-8");
             List<User> currentUser = (List<User>) request.getAttribute("userList");
             //遍历显示
             for (User userlist : currentUser) {
         %>
         <tr>
             <td><%=userlist.getName()%></td>
             <td><%=userlist.getSex()%></td>
             <td><a href="deleteStudent.jsp?ID=<%=userlist.getID()%>">删除</a><br>
             <a href="updateStudent.jsp?ID=<%=userlist.getID()%>">修改</a></td>
         </tr>
         <%
             }
         %>
     </table>
     <nav>
         <ul class="pagination">
             <li><a href="userPageServlet?start=0"> <span>首页</span>
             </a></li>
             <li><a href="userPageServlet?start=${requestScope.prePage }">
                     <span>前一页</span>
             </a></li>
             <li><a href="userPageServlet?start=${requestScope.nextPage }">
                     <span>后一页</span>
             </a></li>
             <li><a href="userPageServlet?start=${requestScope.totalPage-1} ">
                     <span>尾页</span>
             </a></li>
         </ul>
     </nav>
 </body>
 </html>

 

推荐阅读