本文提示,因为细节太多,最好有一定基础的码友,因为其中我封装了其他方法!大家可以从我这里看一部分比较重要的代码!
这里我说一下,分页的主要流程:
流程1:设置为存储分页信息的PageBean
在servlet层:
在service层和dao层:
jsp页面::我就不说明了,因为其中代码注释已近很详细了,可以直接看代码!
接下来,把我的源码给大家:
PageBean:
import java.util.List;
public class PageBean<T> {
private int currentPage;//当前页码
// private int toatalPage;//总页数
private int totalData;//总数据条数
private int pageSize;//每页的大小
private List<T> beanList;//每页的数据
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
//总页数不需要指定(由 总数据/每页 大小可得)
public int getTotalPage() {
int totalPage = totalData/pageSize;
//如果正好,则返回,如果多余,则多余的再加一页!
return totalData%pageSize==0?totalPage:totalPage+1;
}
public int getTotalData() {
return totalData;
}
public void setTotalData(int totalData) {
this.totalData = totalData;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<T> getBeanList() {
return beanList;
}
public void setBeanList(List<T> beanList) {
this.beanList = beanList;
}
}
dao代码:我就把调用的那个方法拿出来给大家看下(其他部分的代码跟我们的题目没有关系):
/**
* 查询所有的用户
* 用户保存在list集合中
* @return
*/
public PageBean<Customer> findAll(int currentPage, int pageSize) {
PageBean<Customer> pageBean = new PageBean<>();
String sql1 = "select count(*) from t_customer";
Number num;
try {
num = (Number)qr.query(sql1, new ScalarHandler<Integer>());
//设置总的数据条数
pageBean.setTotalData(num.intValue());
} catch (SQLException e1) {
e1.printStackTrace();
}
String sql2 = "select * from t_customer order by cname limit ?,?";
//设置从当前页面开始查询条数
int begin = (currentPage-1)*pageSize;
int step = pageSize;
Object params[] = {begin,step};
try {
pageBean.setBeanList(qr.query(sql2, new BeanListHandler<Customer>(Customer.class),params));
} catch (SQLException e) {
e.printStackTrace();
}
return pageBean ;
}
seevice层代码:
/**
* 查询pageBean信息
* 返回一个pageBean
* @return
*/
public PageBean<Customer> findAll(int currentPage, int pageSize){
return customerDao.findAll(currentPage,pageSize);
}
servlet层代码:
/**
* 分页查询(查询所有用户,分页显示)
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String findAll(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置每页的数据条数(10)
int pageSize = 10;
//设置当前的页数
int currentPage = getPc(request) ;
//从service得到的pageBean中已经有了totalData,和beanlist(每页的数据)
PageBean<Customer> pageBean = customerService.findAll(currentPage,pageSize);
//再设置 每页的数据条数和当前的页数
//那么此时的pageBean就是完整的了
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
//保存pageBean
request.setAttribute("pageBean",pageBean);
return "f:/list.jsp";
}
/**
* 从请求的参数里面获取当前页面值
* @return
*/
public int getPc(HttpServletRequest request) {
String pageCode = request.getParameter("pc");
int pc = 1;
if(pageCode != null && !pageCode.trim().isEmpty()) {
pc = Integer.parseInt(pageCode);
}
return pc;
}
jsp页面代码:
<table border="1" width="70%" align="center">
<tr>
<th>客户姓名</th>
<th>性别</th>
<th>生日</th>
<th>手机</th>
<th>邮箱</th>
<th>描述</th>
<th>操作</th>
</tr>
<c:forEach items="${pageBean.beanList }" var="customer">
<tr>
<td>${customer.cname }</td>
<td>${customer.gender }</td>
<td>${customer.birthday }</td>
<td>${customer.cellphone }</td>
<td>${customer.email }</td>
<td>${customer.description }</td>
<td>
<a href="<c:url value='/CustomerServlet?method=findCustomerByCid&cid=${customer.cid }'/>">编辑</a>
<a href="<c:url value='/CustomerServlet?method=delete&cid=${customer.cid }'/>">删除</a>
</td>
</tr>
</c:forEach>
</table>
<br>
<center>
第${pageBean.currentPage }页/共${pageBean.totalPage }页
<c:choose>
<c:when test="${pageBean.currentPage eq 1} ">
首页
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<%-- 如果已经是第一页了,那么就不需要上一页了 --%>
<%-- 也就那么就不需要首页的超链接了 --%>
<c:choose>
<c:when test="${pageBean.currentPage eq 1 }">
</c:when>
<c:otherwise>
<a href="<c:url value='/CustomerServlet?method=findAll&pc=1' />">首页</a>
<a href="<c:url value='/CustomerServlet?method=findAll&pc=${pageBean.currentPage-1 }' />">上一页</a>
</c:otherwise>
</c:choose>
<%-- 这一个choose是处理begin(开始的页面)end(结束的页码数) --%>
<c:choose >
<%-- 如果总页数小于10 那么页码就是固定的(1 2 3 4 5 6 7 8 9 10) --%>
<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>
<%--
测试下面的公式
假如当前页面为6,则有
2 3 4 5 (6) 7 8 9 10 11
--%>
<%-- 这里又会发生 头溢出 或者 尾溢出 --%>
<c:set var="begin" value="${pageBean.currentPage-4 }"></c:set>
<c:set var="end" value="${pageBean.currentPage+5 }"></c:set>
<c:choose>
<%-- 头溢出:说明 1-10页还可以表示 ( 因为 begin-4 <1 )--%>
<c:when test="${begin < 1 }">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="10"></c:set>
</c:when>
<%-- 尾溢出:说明用不到当前页面+5 就可以显示结束 --%>
<c:when test="${end > pageBean.totalPage }">
<c:set var="begin" value="${pageBean.totalPage-9 }"></c:set>
<c:set var="end" value="${pageBean.totalPage }"></c:set>
</c:when>
</c:choose>
</c:otherwise>
</c:choose>
<%-- 这个forEach从上面获得begin和end 那么就可以输出导航页面了--%>
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<c:when test="${i == pageBean.currentPage }">
${i }
</c:when>
<c:otherwise>
<a href="${pageBean.url }&pc=${i}">${i }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<%-- 如果已经是尾页了,那么就不需要下一页了 --%>
<%-- 也就就不需要尾页的超链接了 --%>
<c:choose>
<c:when test="${pageBean.currentPage eq pageBean.totalPage }">
</c:when>
<c:otherwise>
<a href="<c:url value='/CustomerServlet?method=findAll&pc=${pageBean.currentPage+1 } '/>">下一页</a>
<a href="<c:url value='/CustomerServlet?method=findAll&pc=${pageBean.totalPage } ' />">尾页</a>
</c:otherwise>
</c:choose>
</center>
</body>