分页技术就是JSP页面用来显示数据。如果有100条数据,分页显示,每页显示10条,总共有10页;好处就是利于页面布局,且显示效率高。
分页关键点
1. 分页的SQL语句
//admin被分页的表,limit两个参数控制起始和终止页
select * from admin limit 0,4;
2. 后台处理: dao/service/servlet/jsp
实现步骤:
一. 环境准备:
引入jar文件及引入配置文件
公用类:JdbcUtil.java
二. 设计:PageBean.java
/**
* 封装分页的参数
*/
public class PageBean {
// 当前页, 默认显示第一页
private int currentPage = 1;
// 每页显示的行数(查询返回的行数), 默认每页显示4行
private int pageCount = 4;
// 总记录数
private int totalCount;
// 总页数 = 总记录数 / 每页显示的行数 (+ 1)
private int totalPage;
// 分页查询到的数据
private List pageData;
// 返回总页数
public int getTotalPage() {
if (totalCount % pageCount == 0) {
totalPage = totalCount / pageCount;
} else {
totalPage = totalCount / pageCount + 1;
}
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage){
this.currentPage = currentPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List getPageData() {
return pageData;
}
public void setPageData(List pageData) {
this.pageData = pageData;
}
三. 设计数据库
//注意名字与PageBean中一致
create table employee(
empId integer primary key,
empName varchar(20),
dept_id integer
);
接着插入十几行数据
四. Dao接口设计/实现
/**
* IEmployeeDao
* 数据访问层,接口设计
*/
public interface IEmployeeDao {
/**
* 分页查询数据
*/
public void getAll(PageBean pb);
/**
* 查询总记录数
*/
public int getTotalCount();
}
/**
* EmployeeDao
* 数据访问层实现
*/
public class EmployeeDao implements IEmployeeDao {
@Override
public void getAll(PageBean pb) {
//2. 查询总记录数; 设置到pb对象中
int totalCount = this.getTotalCount();
pb.setTotalCount(totalCount);
/*
* 问题: jsp页面,如果当前页为首页,再点击上一页报错!
* 如果当前页为末页,再点下一页显示有问题!
* 解决:
* 1. 如果当前页 <= 0; 当前页设置当前页为1;
* 2. 如果当前页 > 最大页数; 当前页设置为最大页数
*/
// 判断
if (pb.getCurrentPage() <=0) {
pb.setCurrentPage(1); // 把当前页设置为1
} else if (pb.getCurrentPage() > pb.getTotalPage()){
pb.setCurrentPage(pb.getTotalPage()); // 把当前页设置为最大页数
}
//1. 获取当前页: 计算查询的起始行、返回的行数
int currentPage = pb.getCurrentPage();
int index = (currentPage -1 ) * pb.getPageCount(); // 查询的起始行
int count = pb.getPageCount(); // 查询返回的行数
//3. 分页查询数据; 把查询到的数据设置到pb对象中
String sql = "select * from employee limit ?,?";
try {
// 得到Queryrunner对象
QueryRunner qr = JdbcUtils.getQueryRuner();
// 根据当前页,查询当前页数据(一页数据)
List pageData = qr.query(sql, new BeanListHandler(Employee.class), index, count);
// 设置到pb对象中
pb.setPageData(pageData);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public int getTotalCount() {
String sql = "select count(*) from employee";
try {
// 创建QueryRunner对象
QueryRunner qr = JdbcUtils.getQueryRuner();
// 执行查询, 返回结果的第一行的第一列
Long count = qr.query(sql, new ScalarHandler());
return count.intValue();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
五.Service/Servlet
/**
* IEmployeeService
* 业务逻辑层接口设计
*/
public interface IEmployeeService {
/**
* 分页查询数据
*/
public void getAll(PageBean pb);
}
/**
* EmployeeService
* 业务逻辑层,实现
*/
public class EmployeeService implements IEmployeeService {
// 创建Dao实例
private IEmployeeDao employeeDao = new EmployeeDao();
@Override
public void getAll(PageBean pb) {
try {
employeeDao.getAll(pb);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
* IndexServlet
* 控制层开发
*/
public class IndexServlet extends HttpServlet {
// 创建Service实例
private IEmployeeService employeeService = new EmployeeService();
// 跳转资源
private String uri;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//1. 获取“当前页”参数; (第一次访问当前页为null)
String currPage = request.getParameter("currentPage");
// 判断
if (currPage == null || "".equals(currPage.trim())){
currPage = "1"; // 第一次访问,设置当前页为1;
}
// 转换
int currentPage = Integer.parseInt(currPage);
//2. 创建PageBean对象,设置当前页参数; 传入service方法参数
PageBean pageBean = new PageBean();
pageBean.setCurrentPage(currentPage);
//3. 调用service
employeeService.getAll(pageBean); // 【pageBean已经被dao填充了数据】
//4. 保存pageBean对象,到request域中
request.setAttribute("pageBean", pageBean);
//5. 跳转
uri = "/WEB-INF/list.jsp";
} catch (Exception e) {
e.printStackTrace(); // 测试使用
// 出现错误,跳转到错误页面;给用户友好提示
uri = "/error/error.jsp";
}
request.getRequestDispatcher(uri).forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
六. JSP
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>分页查询数据title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
head>
<body>
<table border="1" width="80%" align="center" cellpadding="5" cellspacing="0">
<tr>
<td>序号td>
<td>员工编号td>
<td>员工姓名td>
tr>
<c:choose>
<c:when test="${not empty requestScope.pageBean.pageData}">
<c:forEach var="emp" items="${requestScope.pageBean.pageData}" varStatus="vs">
<tr>
<td>${vs.count }td>
<td>${emp.empId }td>
<td>${emp.empName }td>
tr>
c:forEach>
c:when>
<c:otherwise>
<tr>
<td colspan="3">对不起,没有你要找的数据td>
tr>
c:otherwise>
c:choose>
<tr>
<td colspan="3" align="center">
当前${requestScope.pageBean.currentPage }/${requestScope.pageBean.totalPage }页
<a href="${pageContext.request.contextPath }/index?currentPage=1">首页a>
<a href="${pageContext.request.contextPath }/index?currentPage=${requestScope.pageBean.currentPage-1}">上一页 a>
<a href="${pageContext.request.contextPath }/index?currentPage=${requestScope.pageBean.currentPage+1}">下一页 a>
<a href="${pageContext.request.contextPath }/index?currentPage=${requestScope.pageBean.totalPage}">末页a>
td>
tr>
table>
body>
html>
至此一个简单的分页就已经实现。