分页显示功能(“小案例:实现web端对客户资源的增删改查”里面的一个功能)
(2016年11月19日18:15:07 上课学习总结)
效果展示:
第n页/共M页 首页 上一页 页码(1,2,3。。。) 下一页 尾页
分页需要的数据
1、当前页码:pageCode ---->jsp---servlet
2、总页数:totalPage --->servlet
3、每页记录数:pageSize --->servlet
4、当前页记录:datas ---->servlet
如何得到数据
1、当前页码:通过用户点击js页面上的超链接得到,默认值为1
2、总页数:总记录数 % 每页记录数 == 0 ? 总记录数 / 每页记录数 : 总记录数 / 每页记录数 + 1
3、总记录数:totalRecord,查询数据库表得到,select count(*) from customer;
可以看出 现在数据库中有 201 条数据
4、每页记录数:系统给定的固定值,pageSize = 10;
5、当前页记录:保存在集合中,通过查询数据库表得到,select * from customer limit (pageCode-1)*pageSize, pageSize;
把所有的分页有关的数据封装到PageBean中,将以上数据作为它的属性
【1】编写PageBean.java 类,形成业务类
package cn.edu.aynu.rjxy.bean;
import java.util.List;
/**
* 这个bean用于分页显示
*
* @author 子
*
*/
public class PageBean {
private int pageCode; // 当前页码,由jsp页面传回
private int totalPage; // 总页数,查询数据库的总条目 /每一页显示的条数
private int pageSize; // 每一页显示的记录数 为一个固定值
private List<Customer> datas;// 每一页的客户的数据
private int totalRecord;
// 直接返回总页数
public int getTotalPage() {
int totalPage = this.totalRecord /this.pageSize;
return this.totalRecord % this.pageSize == 0 ? totalPage : totalPage + 1;
}
public List<Customer> getDatas() {
return datas;
}
public void setDatas(List<Customer> datas) {
this.datas = datas;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
// 构造方法设置参数变量
public PageBean(int pageCode, int totalRecord) {
super();
this.pageCode = pageCode; // 当前是第几页
this.totalRecord = totalRecord; // 从数据库种总共的记录数
this.pageSize = 10; // 每一页显示的个数固定为 10
}
public PageBean() {
}
public int getPageCode() {
return pageCode;
}
public void setPageCode(int pageCode) {
this.pageCode = pageCode;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
【2】编写 PageDao.java 实现对数据库的操作
package cn.edu.aynu.rjxy.dao;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.edu.aynu.rjxy.bean.Customer;
import cn.edu.aynu.rjxy.utils.JDBCUtils;
/**
* 处理关于分页显示 在数据库中的操作
*
* @author 子
*
*/
public class PageDao {
public static QueryRunner queryRunner = new QueryRunner(
JDBCUtils.getDataSource());
// 得到总记录数
/**
* @return Customer 中的所有记录数
* @throws SQLException
*/
public int getPageTotalRecord() throws SQLException {
String sql = "select count(*) from customer "; // 拿到这个表的总行数
// ScalarHandler 用于获取结果集中第一行某列的数据并转换成 T 表示的实际对象。
// ScalarHandler 的参数为空或null时,返回第一行第一列的数据
Long totalRecord = queryRunner.query(sql, new ScalarHandler<Long>());
return totalRecord.intValue();
}
// 得到一个页面的记录的客户数据
/**
* @param recoderStartIndex 当前页面中记录的起始记录号
* @param pagesize 当前页面需要显示的条目
* @return 一个List<Customer> 集合
* @throws SQLException
*/
public List<Customer> getListCustomer(int recoderStartIndex, int pagesize)
throws SQLException {
String sql = "select * from customer limit ?,?";
List<Customer> datas = queryRunner.query(sql,
new BeanListHandler<Customer>(Customer.class),
recoderStartIndex, pagesize);
return datas;
}
}
【3】编写 PageService.java 实现分页显示业务逻辑
package cn.edu.aynu.rjxy.service;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.jsp.tagext.PageData;
import cn.edu.aynu.rjxy.bean.Customer;
import cn.edu.aynu.rjxy.bean.PageBean;
import cn.edu.aynu.rjxy.dao.PageDao;
/**
* 处理分页的业务逻辑
*
* @author 子
*
*/
public class PageService {
public static PageDao pageDao = new PageDao();
// 分页查询客户业务
/**
* @param pageCode
* @return
* @throws SQLException
*/
public PageBean getPageBean(int pageCode) throws SQLException {
// 总记录数
int pageTotalRecord = pageDao.getPageTotalRecord();
//
PageBean bean = new PageBean(pageCode, pageTotalRecord);
List<Customer> listCustomerdatas = pageDao.getListCustomer(
(pageCode - 1) * bean.getPageSize(), bean.getPageSize());
bean.setDatas(listCustomerdatas);
return bean;
}
}
【4】编写servlet执行doPost 或者 doGet 方法
public void query(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
// //执行查询客户业务
// List<Customer> list = cs.queryAll();
int pagecode = 1;
// 获取pagecode 参数
String s = request.getParameter("pagecode");
if (s != null) {
- //解析为 int 类型
pagecode = Integer.parseInt(s);
}
// 执行pageService 的业务方法拿到 pageBean对象
PageBean pageBean = pageService.getPageBean(pagecode);
int totalPage = pageBean.getTotalPage();
// 将list存放到request域中
request.setAttribute("pageBean", pageBean);
// 通过请求转发将查询结果带到list.jsp页面上显示
request.getRequestDispatcher("/jsp/list.jsp")
.forward(request, response);
}
【5】jsp 页面 主要针对 页码的 变化,几种情况做出处理。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>list.jsp</title>
</head>
<body style="text-align: center;">
<h3>客户列表</h3>
<table border="1" align="center" width="60%">
<tr>
<th>客户姓名</th>
<th>客户性别</th>
<th>客户生日</th>
<th>客户手机</th>
<th>客户邮箱</th>
<th>客户描述</th>
<th>操作</th>
</tr>
<c:forEach items="${pageBean.datas}" var="c">
<tr>
<td>${c.cname }</td>
<td>${c.gender }</td>
<td>${c.birthday }</td>
<td>${c.cellphone }</td>
<td>${c.email }</td>
<td>${c.description }</td>
<td><a
href="<c:url value='/CustomerServlet?method=3&cid=${c.cid }'/>">编辑</a>
<a href="<c:url value='/CustomerServlet?method=5&cid=${c.cid }'/>"
onclick="return confirm('是否真要删除该客户?')">删除</a></td>
</tr>
</c:forEach>
</table>
第${pageBean.pageCode}页/共${pageBean.totalPage}页
<!-- 首页 -->
<a href='<c:url value='/CustomerServlet?method=2&pagecode=1'></c:url>'>首页</a>
<!-- 上一页 -->
<c:if test="${pageBean.pageCode>1 }">
<!-- 当页码大于第一页 -->
<a
href='<c:url value='/CustomerServlet?method=2&pagecode=${pageBean.pageCode-1}'></c:url>'>上一页</a>
</c:if>
<!--【1】 【2】 页码显示 -->
<!-- 初始化页码 -->
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="10"></c:set>
<!-- 在页码显示的当中会出现几种情况 -->
<!--第一种,如果总页码就小于10 那么只显示从开始到总页码就可以了 -->
<c:choose>
<c:when test="${pageBean.totalPage <=10}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${pageBean.totalPage}"></c:set>
</c:when>
<c:otherwise>
<!--第二种,页码大于10,但是在1-5页是不需要让页码发生变化的 -->
<!--第三种 页码大于10,但是在当前页码 +5 就大于了总页码,那么页码也不要变化了 -->
<c:choose>
<c:when test="${pageBean.pageCode - 4 <=1}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="10"></c:set>
</c:when>
<c:when test="${pageBean.pageCode +5>=pageBean.totalPage }">
<c:set var="begin" value="${pageBean.totalPage -9 }"></c:set>
<!-- 起始页码就直接是 总页码-9 -->
<c:set var="end" value="${pageBean.totalPage }"></c:set>
</c:when>
<c:otherwise>
<!--第四种,是正常情况。 比如现在页码是第六页 ,起始页就是 第二页,最终页就是 第11页 -->
<c:set var="begin" value="${pageBean.pageCode-4}"></c:set>
<c:set var="end" value="${pageBean.pageCode+5 }"></c:set>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
<c:forEach var="i" begin="${begin}" end="${end}">
<!-- 判断当前该页码是不是本页 -->
<c:choose>
<c:when test="${pageBean.pageCode == i}">${i}</c:when>
<c:otherwise>
<a
href='<c:url value='/CustomerServlet?method=2&pagecode=${i}'></c:url>'>${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<!--下一页 -->
<c:if test="${pageBean.pageCode< pageBean.totalPage }">
<!-- 当前页码不大于最大的页码 -->
<a
href='<c:url value='/CustomerServlet?method=2&pagecode=${pageBean.pageCode+1 }'></c:url>'>下一页</a>
</c:if>
<a
href='<c:url value='/CustomerServlet?method=2&pagecode=${pageBean.totalPage}'></c:url>'>尾页</a>
</body>
</html>
源码:http://url.cn/41fa5QN
数据库:http://url.cn/41h85BO