分页实现
实现分页功能需要了解几个参数:
1,totalPage 总页数
2,count 一共有多少数据
3,pageSize 每页显示几条
4,currentPage 当前第几页
5,category 商品的种类(导航栏查询需要用到)
6,List<Book> book 商品集合
把这些参数封装到PageBean中
(1)利用mysql的limit,进行物理分页
(2)select * from 表名 limit m,n;
(3)m默认是从0开始,代表是第1条记录
(4)n是指从第m+1条开始,取n条。
例如: select * from book limit 4,10;
从第五条记录开始,取出来10条。
我们需要做的步骤如下:
1.知道一共多少条记录
select count(*) from 表;2.每一页显示多少条记录
这个是认为定义的,即pageSize的初始化值
3.一共有多少页
3.1 总页数=总条数%每页条数==0?总条数/每页条数:总条数/每页条数+1;
3.2 总页数=Math.ceil(总条数*1.0/每页条数); (一般用这个)
4.当前页码
默认值为1 即currentPage初始化为1
当点击上一页,下一页,就是对页码进行加减操作
View层
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>bookStore列表</title>
<%--导入css --%>
<link rel="stylesheet" href="${pageContext.request.contextPath }/css/main.css" type="text/css" />
</head>
<body class="main">
<jsp:include page="head.jsp" />
<jsp:include page="menu_search.jsp" />
<div id="divpagecontent">
<table width="100%" border="0" cellspacing="0">
<tr>
<td>
<div style="text-align:right; margin:5px 10px 5px 0px">
<a href="index.jsp">首页</a> > ${pb.book[0].category } > 图书列表
</div>
<table cellspacing="0" class="listcontent">
<tr>
<td>
<h1>商品目录</h1>
<hr />
<h1>${pb.book[0].category }</h1> 共${pb.count }种商品
<hr />
<div style="margin-top:20px; margin-bottom:5px">
<img src="${pageContext.request.contextPath }/images/productlist.gif" width="100%" height="38" />
</div>
<table cellspacing="0" class="booklist">
<tr>
<c:forEach items="${pb.book }" var="b">
<td>
<div class="divbookpic">
<p>
<a href="#"><img src="${pageContext.request.contextPath }/upload/${b.img_url}" width="115" height="129"
border="0" /> </a>
</p>
</div>
<div class="divlisttitle">
<a href="${pageContext.request.contextPath }/servlet/findBookInfoServlet?id=${b.id}">书名:${b.name }<br />售价:${b.price } </a>
</div>
</td>
</c:forEach>
</tr>
</table>
<div class="pagination">
<ul> //如果已经是第一页了,页数值赋值为1,不再进行减操作
<li class="disablepage"><a href="${pageContext.request.contextPath }/servlet/pageServlet?currentPage=${pb.currentPage==1?1:pb.currentPage-1}&category=${pb.category}"><<上一页</a></li>
<li>第${pb.currentPage }页/共${pb.totalPage }页</li>
//如果已经是最后一页了,页数值赋值为总页数,不再进行加操作
<li class="nextPage"><a href="${pageContext.request.contextPath }/servlet/pageServlet?currentPage=${pb.currentPage==pb.totalPage?pb.totalPage:pb.currentPage+1}&category=${pb.category}">下一页>></a></li>
</ul>
</div></td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<jsp:include page="foot.jsp" />
</body>
</html>
Web层
public class PageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//初始化每页显示的记录条数
int pageSize = 4;
//初始化当前页数默认为第一页
int currentPage = 1;
String category = request.getParameter("category");
if(category==null){
category="";
}
//从页面的上一页或者下一页得到数据
String currPage = request.getParameter("currentPage");
//第一次访问资源时,currPage可能为null
if(currPage!=null){
currentPage = Integer.parseInt(currPage);
}
BookServiceImpl bs = new BookServiceImpl();
//分页查询,并返回PageBean对象
PageBean pb = bs.findBooksPage(currentPage, pageSize,category);
//分发转向
request.setAttribute("pb", pb);
request.getRequestDispatcher("/product_list.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Service层
public class BookServiceImpl {
public PageBean findBooksPage(int currentPage, int pageSize,String category) {
try {
int count = bookDao.count(category);//得到总记录数
int totalPage = (int)Math.ceil(count*1.0/pageSize); //求出总页数
List<Book> books= bookDao.findBooks(currentPage,pageSize,category);
//把5个变量封装到PageBean中,做为返回值
PageBean pb = new PageBean();
pb.setBook(books);
pb.setCount(count);
pb.setCurrentPage(currentPage);
pb.setPageSize(pageSize);
pb.setTotalPage(totalPage);
pb.setCategory(category);
return pb;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
Dao层
public class BookDaoImpl {
public List<Book> findBooks(int currentPage, int pageSize, String category) throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
String sql = "select * from book where 1=1";
List list = new ArrayList();
if(!"".equals(category)){
sql+=" and category=?";
list.add(category);
}
sql+=" limit ?,?";
list.add((currentPage-1)*pageSize);
list.add(pageSize);
return qr.query(sql, new BeanListHandler<Book>(Book.class),list.toArray());
}
}