JavaWeb学习(18):实现分页

分页是什么?

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

实现方式:

要实现分页,必须知道  某一页的 数据 从哪里开始 到哪里结束。
值得注意的一点是:不同的数据库实现分页的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							  (查数据库,分页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" %>




Insert title here


		<% 
			// 增加 一个标记,用作提示是否增加成功
			String error = (String)request.getAttribute("error");
			if(error != null ) {
				if(error.equals("addError")){
					out.print("增加失败");
				} else if(error.equals("successAdd")){
					out.print("增加成功");
				}
			}
		%>
		
		
				<% 
				
					// 我们将实现分页的 5 个变量放到一个实体类中,那么前台获取的也是一个实体类
					// request.getAttribute() 返回值是一个 Object的对象,所以在这里需要进行强制转换
					Page p = (Page)request.getAttribute("pages");
					
					
					for(Student student:p.getStudents()) {
				%>	 
					
				 <% 
				 	}
					
				 %>
			
		
学号 姓名 年龄 性别 地址 操作
<%=student.getSno() %> <%=student.getName()%> <%=student.getAge() %> <%=student.getSex() %> <%=student.getSad() %> 删除
注册 <% // Mysql 实现分页是从 0 开始的 // 首页时只显示 下一页和尾页 if(p.getCurrentPage() == 0) { %> 下一页 尾页 <% // 尾页时只显示上一页和首页 }else if(p.getCurrentPage() == p.getTotalPage() - 1) { %> 首页 上一页 <% // 其余页面四个链接均显示 } else { %> 首页 上一页 下一页 尾页 <% } %>

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 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 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 queryStudentByPage(int currentPage, int pageSize) {
		// 分页查询语句
		// 第一个占位符:当前页面 * 页面大小
		// 第二个占位符:页面大小
		String sql = "select * from student limit ?,?";
		// 当前页面和页面大小都是由前台传过来的
		Object[] pstams = {currentPage * pageSize,pageSize};
		List 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 students;

	public Page() {
	}

	public Page(int currentPage, int pageSize, int totalCount, int totalPage, List 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 getStudents() {
		return students;
	}

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

其他部分:

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

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

效果:

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

首页:

JavaWeb学习(18):实现分页_第1张图片

下一页:

JavaWeb学习(18):实现分页_第2张图片

尾页:

JavaWeb学习(18):实现分页_第3张图片

客官留步:

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

你可能感兴趣的:(JavaWeb学习(18):实现分页)