分页

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.目前我们的分页栏,大部分内容都是可以复用的,但是我们页码,首页,末页等等这些超链接的地址还是写死,我们就希望可以动态的获取请求的地址。所以我们下一步需要获取请求地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值