1创建一个Page类
int pageNumber 当前页码,需要用户指定,在Servlet中获取
int pageSize 每页显示的条数,自己或用户指定,在Servlet中设置
int totalRecord 总记录数,需要从数据库中查询
int totalPage 总页数,通过计算获取
int index 开始索引,通过计算获取
List data 保存要显示的图书的信息
public class Page<T> {
/**
* 当前页码,在Servlet中获取,在service中设置
*/
private int pageNumber;
/**
* 没页显示的条数,在Servlet中获取,在service中设置
*/
private int pageSize;
/**
* 总记录数,通过数据库查询
*/
private int totalRecord;
/**
* 开始索引,通过计算获得
* 在getIndex方法中来计算index的值
*/
//private int index;
/**
* 总页数,通过计算获得
* 在getTotalPage方法中计算
*/
//private int totalPage;
/**
* 分页数据
*/
private List<T> data;
public int getPageNumber() {
//如果pageNumber小于1则返回1
if(pageNumber<1){
return 1;
}
//如果pageNumber大于总页数,则返回总页数
if(pageNumber > getTotalPage()){
return getTotalPage();
}
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
public int getIndex() {
/**
* 计算index的值
* SELECT * FROM bs_book LIMIT index , pageSize
*
* pageNumber pageSize index
* 1 4 0
* 2 4 4
* 3 4 8
*
* (pageNumber-1)*pageSize
*/
return (getPageNumber()-1)*getPageSize();
}
/*public void setIndex(int index) {
this.index = index;
}*/
public int getTotalPage() {
/**
* 计算总页数
*
* 总记录数 每页的条数 总页数
* 10 2 5
* 9 2 5
* 8 2 4
* 7 2 4
* 6 2 3
*
* totalRecord/pageSize+1
*/
//如果总记录数除以没页条数余数为0则直接返回getTotalRecord()/getPageSize()
if(getTotalRecord()%getPageSize() == 0){
return getTotalRecord()/getPageSize();
}else{
//否则返回getTotalRecord()/getPageSize()+1
return getTotalRecord()/getPageSize()+1;
}
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
2.BookDao
修改BookDao
在BookDao创建一个新的方法
Page findBook(Page page);
@Override
public Page<Book> findBook(Page<Book> page) {
//这个方法是被BookService调用,
//BookService调用该方法时pageNumber和pageSize已经设置好了
//pageNumber(已设置) pageSize(已设置)
//totalRecord(未设置) index totalPage data(未设置)
//设置totalRecord,也就是总记录数
String sql = "SELECT COUNT(*) FROM bs_book";
//查询总记录数
long totalRecord = (long) this.getSingleValue(sql);
//将总记录数设置进page对象
page.setTotalRecord((int)totalRecord);
//查询图书的信息
sql = "SELECT id,title,author,price,sales,stock,img_path imgPath "
+ "FROM bs_book LIMIT ? , ?";
List<Book> data = this.getBeanList(sql, page.getIndex() , page.getPageSize());
//将data设置进page对象
page.setData(data);
return page;
}
3.修改BookService
在BookService中添加一个新的方法
Page findBook(String pageNumber , int pageSize);
@Override
public Page<Book> findBook(String pageNumber, int pageSize) {
//将pageNumber强转为int
//为pn定义一个默认值
int pn = 1;
try {
pn = Integer.parseInt(pageNumber);
} catch (NumberFormatException e) {
}
//创建Page对象
Page<Book> page = new Page<Book>();
//设置页码和每页显示的条数
page.setPageNumber(pn);
page.setPageSize(pageSize);
return bookDao.findBook(page);
}
4.修改BookManagerServlet
添加一个新的方法:
findBook();
/**
* 查找图书的分页数据
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void findBook(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取用户发送的页码
String pageNumber = request.getParameter("pageNumber");
//指定一个每页显示的条数
int pageSize = 5;
//调用Service查询分页数据
Page<Book> page = bookService.findBook(pageNumber, pageSize);
//将page放入进request域中
request.setAttribute("page", page);
//转发到book_manager.jsp
request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request, response);
}
4.解决问题的关键:
a)目前的情况我们在遍历页码是begin的值永远为1,而end的值永远为最大页码。
b)我们要解决这个问题,就不能把begin和end的值写死,我们需要通过计算来获取begin和end的值。
c)现在问题就变成了如何设置begin和end的值:
i.如果总页数小于等于5页
1.begin=1 end=totalPage
ii.如果pageNumber小于等于3
1.begin=1 end=5
iii.如果pageNumber大于3
1.begin = pageNumber-2 end=pageNumber+2
2.如果end > totalPage (最后一页大于总页数)
a)end = totalPage
b)begin = totalPage-4
5.目前我们的分页栏,大部分内容都是可以复用的,但是我们页码,首页,末页等等这些超链接的地址还是写死,我们就希望可以动态的获取请求的地址。所以我们下一步需要获取请求地址