JavaWeb学习(18):实现分页 分页是什么? 实现方式: 实现分页的 5 个变量: Code: Page(实体类--封装分页的 5 个变量) 其他部分: 效果: 客官留步:

简单来说就是,内容太多,一个页面是放不下太多东西的,这时候分页闪亮登场。
我们常见的 首页、上一页、下一页、尾页都是通过分页来实现的。

实现方式:

要实现分页,必须知道  某一页的 数据 从哪里开始 到哪里结束。
值得注意的一点是:不同的数据库实现分页的sql语句不同,(本文主要介绍,MySql)

页面大小:每页显示的数据量

假设每页显示10条数据

mysql分页:
mysql:从0开始计数
0		0		9
1		10		19
2		20		29
n		n*10	      (n+1)*10-1

结论:
分页:
第n页的数据:  第(n-1)*10+1条  -- 第n*10条
MYSQL实现分页的sql:
limit  开始,多少条
第0页
    select * from student limit 0,10 ;
第1页
    select * from student limit 10,10 ;
第2页
    select * from student limit  20,10 ;
第n页
    select * from student limit n*10,10

mysql的分页语句:

select * from student limit 页数*页面大小,页面大小

实现分页的 5 个变量:

5个变量(属性)			
1.数据总数	100	103					 (查数据库,select count(*)..)									
2.页面大小(每页显示的数据条数)20				          (用户自定义)
3.总页数 							 (程序自动计算)
   	总页数 = 100/20  =数据总数/页面大小
   	总页数 = 103/20 = 数据总数/页面大小+1
        --->
        总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;

								
4.当前页(页码)							 (用户自定义)								
5.当前页的对象集合(实体类集合):每页所显示的所有数据 (10个人信息)
List<Student>							  (查数据库,分页sql)	

Code:

本代码是在 优化三层 代码的基础上进行的修改,在此只附上修改部分的代码,其余部分参考 其他几篇文章。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import = "java.util.List" %>
<%@ page import = "org.entity.Student" %>
<%@ page import = "org.entity.Page" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<% 
			// 增加 一个标记,用作提示是否增加成功
			String error = (String)request.getAttribute("error");
			if(error != null ) {
				if(error.equals("addError")){
					out.print("增加失败");
				} else if(error.equals("successAdd")){
					out.print("增加成功");
				}
			}
		%>
		<!-- 表格布局实现显示用户的各个信息 -->
		<table border = "1">
			<tr>
				<th>学号</th>
				<th>姓名</th>
				<th>年龄</th>
				<th>性别</th>
				<th>地址</th>
				<th>操作</th>
			</tr>
		<!-- 因为用户是动态的,所以我们选择用循环进行动态添加 -->
				<% 
				
					// 我们将实现分页的 5 个变量放到一个实体类中,那么前台获取的也是一个实体类
					// request.getAttribute() 返回值是一个 Object的对象,所以在这里需要进行强制转换
					Page p = (Page)request.getAttribute("pages");
					
					
					for(Student student:p.getStudents()) {
				%>	 
					<tr>
						<!-- 将学号设置成一个超链接,点击即可实现查看用户的详细信息 -->
						<td> <a href = "QueryStudentStudent?sno=<%=student.getSno() %>"><%=student.getSno() %></a>  </td>
						<td> <%=student.getName()%></td>
						<td> <%=student.getAge() %></td>
						<td> <%=student.getSex() %></td>
						<td> <%=student.getSad() %></td>
						<td> <a href = "DeleteStudentServlet?sno=<%=student.getSno()%>">删除 </a></td>
					</tr>
				 <% 
				 	}
					
				 %>
			
		</table>
		<!-- 超链接到 add.jsp 进行 增加用户 -->
		<a href = "add.jsp">注册</a>
		
		<%
			// Mysql 实现分页是从 0 开始的
			// 首页时只显示 下一页和尾页
			if(p.getCurrentPage() == 0) {
		%>
				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()+1 %>">下一页</a>
				<a href = "queryStudentByPage?currentPage=<%=p.getTotalPage() - 1%>">尾页</a>
		<% 
			// 尾页时只显示上一页和首页
			}else if(p.getCurrentPage() == p.getTotalPage() - 1) {
		
		%>
				<a href = "queryStudentByPage?currentPage=0">首页</a>
				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()-1 %>">上一页</a>
		<% 
			// 其余页面四个链接均显示
			} else {
		%>
				<a href = "queryStudentByPage?currentPage=0">首页</a>
				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()-1 %>">上一页</a>
				<a href = "queryStudentByPage?currentPage=<%=p.getCurrentPage()+1 %>">下一页</a>
				<a href = "queryStudentByPage?currentPage=<%=p.getTotalPage() - 1 %>">尾页</a>
		<% 
			}
		
		%>
		
		
</body>
</html>

queryStudentByPage.java(Serlvet部分)

package org.servlet;


import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.entity.Page;
import org.entity.Student;
import org.service.IStudentService;
import org.service.impl.StudentServiceImpl;


@WebServlet("/queryStudentByPage")
public class queryStudentByPage extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
		IStudentService studentService = new StudentServiceImpl();
		// 获取数据总数
		int totalCount = studentService.getTotalCount();
		String cPage = request.getParameter("currentPage");
		// 第一次访问这个页面是 NULL
		if(cPage == null) cPage = "0";
		// 当前页面是第几页
		int currentPage = Integer.parseInt(cPage);
		// 页面大小
		String pSize = request.getParameter("select");
		if(pSize == null) pSize = "3";
		int pageSize = Integer.parseInt(pSize);

		// 用户的数据信息(根据页面查询学生)
		List<Student> students = studentService.queryStudentPage(currentPage, pageSize);
		
		// 将 5 个变量封装成一个实体类(实际上 4 个变量就可以了,页面数量可以计算出来)
		
		Page p= new Page();
		// 注意顺序
		p.setCurrentPage(currentPage);
		p.setTotalCount(totalCount);
		p.setPageSize(pageSize);
		p.setStudents(students);
		// 将数据域放到 request 中,传输到前台,前台通过 Key 取 Value
		request.setAttribute("pages", p);
		
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

StudentServiceImpl(Service)

添加下列方法(添加时先实现接口):
        public List<Student> queryStudentPage(int currentPage, int pageSize) {
		return stu.queryStudentByPage(currentPage, pageSize);
	}
	@Override
	// 获取数据总数
	public int getTotalCount() {
		return stu.getTotalCount();
	}

StudentDaoImpl(Dao)

 添加下列方法(添加时先实现接口):
@Override
	// 查询总数据量
	public int getTotalCount() {
		String sql = "select count(1) from student";
		int count = DBUtil.getTotalCount(sql);
		return count;
	}

	@Override
	// 分页查询
	public List<Student> queryStudentByPage(int currentPage, int pageSize) {
		// 分页查询语句
		// 第一个占位符:当前页面 * 页面大小
		// 第二个占位符:页面大小
		String sql = "select * from student limit ?,?";
		// 当前页面和页面大小都是由前台传过来的
		Object[] pstams = {currentPage * pageSize,pageSize};
		List<Student> students = new  ArrayList<>();
		ResultSet rs = DBUtil.excucateQuery(sql, pstams);
		try {
			while(rs.next()) { 
				Student student = new Student(rs.getInt("sno"),rs.getString("sname"),rs.getInt("sage"),rs.getString("ssex"),rs.getString("sad"));
				students.add(student);	
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 将查询结果返回到 Service
		return students;
	}

Page(实体类--封装分页的 5 个变量)

package org.entity;

import java.util.List;

//分页帮助类
public class Page {
//	当前页  currentPage
	private int currentPage;
//	页面大小 pageSize
	private int pageSize ;

//	总数据 totalCount
	private int totalCount;
//	总页数   totalPage
	private int totalPage ;
	
//	当前页的数据集合  students
	
	private List<Student> students;

	public Page() {
	}

	public Page(int currentPage, int pageSize, int totalCount, int totalPage, List<Student> students) {
		this.currentPage = currentPage;
		this.pageSize = pageSize;
		this.totalCount = totalCount;
		this.totalPage = totalPage;
		this.students = students;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getPageSize() {
		return pageSize;
	}
	/*
	 * 总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
	 * 
	 * 当我们调换用了 数据总数的set() 和 页面大小的set()以后,自动计算出 总页数
	 * 务必注意顺序:先set 数据总数   再set 页面大小
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
		//自动计算出 总页数
	
//		总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
		this.totalPage =this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:totalCount/this.pageSize+1; 
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public int getTotalPage() {
		return totalPage;
	}

	//给总页数赋值
//	public void setTotalPage(int totalPage) {
//		this.totalPage = totalPage;
//	}

	public List<Student> getStudents() {
		return students;
	}

	public void setStudents(List<Student> students) {
		this.students = students;
	}
	
}

其他部分:

之前我们访问时面向的是查询全部,现在就需要改成访问查询分页的Servlet:
例如在增加用户时,改成这个:

JavaWeb学习(18):实现分页
分页是什么?
实现方式:
实现分页的 5 个变量:
Code:
Page(实体类--封装分页的 5 个变量)
其他部分:
效果:
客官留步:

其他修改,删除界面都需要改动,否则会出现 Null

效果:

访问时我们需要访问的是  queryStudentByPage

首页:

JavaWeb学习(18):实现分页
分页是什么?
实现方式:
实现分页的 5 个变量:
Code:
Page(实体类--封装分页的 5 个变量)
其他部分:
效果:
客官留步:

下一页:

JavaWeb学习(18):实现分页
分页是什么?
实现方式:
实现分页的 5 个变量:
Code:
Page(实体类--封装分页的 5 个变量)
其他部分:
效果:
客官留步:

尾页:

JavaWeb学习(18):实现分页
分页是什么?
实现方式:
实现分页的 5 个变量:
Code:
Page(实体类--封装分页的 5 个变量)
其他部分:
效果:
客官留步:

客官留步:

如果疑问,可随时联系ME. 如需要源代码,欢迎随时联系ME.