为什么要分页?
1. 加快页面加载速度 2. 利于页面排版 3. 利于用户操作
分页的方式
前台分布:一次性加载所有的数据,再在前台把数据分成多页显示,加载速度还是比较慢
后台分页:从数据库开始进行分页查询,发送给前台
分页的思路
1.查询出所有的行数
2. 计算出总页数(页数/行数)
3. 通过总页数绘制了同超链接
4. 点击链接,发送页数参数,在后台进行分页查询,将结果发送给页面
5. 页面进行数据显示
6. 页面中所需要的数据:对象的集合,页面的总数,当前页面的数量
具体实现
注:这里主要讲思路,及部分代码的实现
分页的实体类包装,并获得get,set方法
/**
* 分页实体类,包装分页需要的数据
* <T>是声明范型类型,目的是可以用于包装任何类型的集合
*/
public class Page<T> {
//每页的行数
public static final int PAGE_SIZE = 10;
//数据集合
private List<T> data;
//页面总数
private int pageCount;
//当前的页数
private int pageNo;
……
}
dao实现层所实现方法:(这里使用的是c3p0连接池与数据库的连接)
1. 计算出所有行数(select count(*) from 表)
@Override
public int selectCount() {
return JDBCUtils.queryCount("select count(*) from tb_book");
}
2. 使用limit分页查询(select * from tb_book limit 起始位置,最后位置)
@Override
public List<Book> selectBookLimit(int start, int lenth) {
// TODO Auto-generated method stub
return JDBCUtils.queryAll(Book.class, "select * from tb_book limit ?,?", start ,lenth);
}
service实现层实现方法
@Override
public Page<Book> selectBookLimit(int pageNo) {
//查询行数
int total=bookDao.selectCount();
//计算分页的数量
int pageNum= total%Page.PAGE_SIZE==0 ?total/Page.PAGE_SIZE:total/Page.PAGE_SIZE+1;
//通过当前页数计算出数据的集合
List<Book> book = bookDao.selectBookLimit((pageNo-1)*Page.PAGE_SIZE, (pageNo-1)*Page.PAGE_SIZE+Page.PAGE_SIZE);
Page<Book> page=new Page<Book>();
page.setData(book);
page.setPageCount(total);
page.setPageNo(pageNum);
return page;
}
servlet层方法
public void bookPageSelect(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException{
String pageNo=req.getParameter("pageNo");
int no=1;
//这里判断的从页面上传来的页数,默认为1
if(pageNo!=null){
no=Integer.parseInt(pageNo);
}
Page<Book> page = bookService.selectBookLimit(no);
//向页面传page对象
req.getSession().setAttribute("page", page);
req.getRequestDispatcher("book.jsp").forward(req, resp);
}
book.jsp页面设计
<table border="1">
<tr>
<td>序号</td>
<td>书名</td>
<td>价格</td>
<td>作者</td>
<td>日期</td>
<td>封面</td>
<td>删除</td>
<td>修改</td>
</tr>
<c:forEach var="book" items="${page.getData()}">
<tr>
<td>${book.book_id}</td>
<td>${book.book_name}</td>
<td>${book.book_price}</td>
<td>${book.book_author}</td>
<td>${book.book_publish_date}</td>
<td><img src="http://localhost:8080/image/${book.book_image}" width="100" height="80"/></td>
<td><a href="book.do?m=bookDel&book_id=${book.book_id}">删除</a></td>
<td><a href="book.do?m=bookOne&book_id=${book.book_id}">修改</a></td>
</tr>
</c:forEach>
</table>
<div>
<c:if test="${page.pageNo>1}">
<a href="book.do?m=bookPageSelect&pageNo=${page.pageNo-1}">上一页</a>
</c:if>
<!-- 循环绘制分页的超链接 -->
<c:forEach var="i" begin="1" end="${page.pageCount}" step="1">
<a href="book.do?m=bookPageSelect&pageNo=${i}">${i}</a>
</c:forEach>
<c:if test="${page.pageNo<page.pageCount}">
<a href="book.do?m=bookPageSelect&pageNo=${page.pageNo+1}">下一页</a>
</c:if>
</div>