分页是什么?
简单来说就是,内容太多,一个页面是放不下太多东西的,这时候分页闪亮登场。
我们常见的 首页、上一页、下一页、尾页都是通过分页来实现的。
实现方式:
要实现分页,必须知道 某一页的 数据 从哪里开始 到哪里结束。
值得注意的一点是:不同的数据库实现分页的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
首页:
下一页:
尾页:
客官留步:
如果疑问,可随时联系ME. 如需要源代码,欢迎随时联系ME.