实现分页 包括 区间查询分页
一、获取请求参数 MaxPrice minPrice pageNo
把分页和区间分页写在一起
给区间分页的数据默认值 :
protected void getBooks(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pageNoStr=request.getParameter("pageNo");
String minPriceStr=request.getParameter("minPrice");
String maxPriceStr=request.getParameter("maxPrice");
int pageNo=1;
int minPrice=0;
int maxPrice=Integer.MAX_VALUE;
try{
pageNo=Integer.parseInt(pageNoStr);
}catch(NumberFormatException e){
}
try{
minPrice=Integer.parseInt(minPriceStr);
}catch(NumberFormatException e){
}
try{
maxPrice=Integer.parseInt(maxPriceStr);
}catch(NumberFormatException e){
}
CriteriaBook criteriabook=new CriteriaBook(pageNo,minPrice,maxPrice);
Page<Book> page=bookService.getPage(criteriabook);
request.setAttribute("bookpage", page);
request.getRequestDispatcher("/WEB-INF/pages/books.jsp").forward(request, response);
}
books.jsp主要的显示页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="script/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function(){
$("#pageNo").change(function(){
var val=$(this).val();
val=$.trim(val);
//1.校检val 是否为数字 1 2 而不是 a12,c
var flag=false;
var reg=/^\d+$/g;
var pageNo=0;
if(reg.test(val)){
//2.校检val在一个合法范围内 1-totalPageNumber
pageNo=parseInt(val);
if(pageNo>=1&&pageNo<=parseInt("${bookpage.totalPageNumber}")){
flag=true;
}
}
if(!flag){
alert("您输入的不是合法页码");
$(this).val();
return ;
}
//3.页面条转
var href="bookServlet?method=getBooks&PageNo="+pageNo+"&"+$(":hidden").seralize();
window.location.href=href;
})
})
</script>
<%@ include file="/commons/queryCondition.jsp" %>
</head>
<body>
<center>
<c:if test="${param.title !=null} ">
您已经将${param.title }放入到购物车中
<br><br>
</c:if>
<c:if test="${!empty sessionScope.ShoppingCart.books }">
您的购物车中有
${sessionScope.ShoppingCart.bookNumber} 本书,<a href="bookServlet?method=forwardPage&page=cart&pageNo=${bookpage.pageNo }">查看购物车</a>
</c:if>
<br><br>
<form action="bookServlet?method=getBooks" method="post">
Price:
<input type="text" size="1" name="minPrice"/>
<input type="text" size="1" name="maxPrice"/>
<input type="submit" value="Submit"/>
</form>
<br><br>
<table cellpadding="10">
<c:forEach items="${bookpage.list }" var="book">
<tr>
<td>
<a href="bookServlet?method=getBook&pageNo=${bookpage.pageNo }&id=${book.id}"
>${book.title} </a>
<br> </td>
<td> ${book.author }</td>
<td>${book.price }</td>
<td><a href="bookServlet?method=addToCart&pageNo=${bookpage.pageNo}&id=${book.id}&title=${book.title}">加入购物车</a></td>
</tr>
</c:forEach>
</table>
<br><br>
共${bookpage.totalPageNumber }页
当前第 ${bookpage.pageNo}页
<c:if test="${bookpage.hasPrev}">
<a href="bookServlet?method=getBooks&pageNo=1">首页</a>
<a href="bookServlet?method=getBooks&pageNo=${bookpage.prevPage }">上一页
</a>
</c:if>
<c:if test="${bookpage.hasNext }">
<a href="bookServlet?method=getBooks&pageNo=${bookpage.nextPage }">下一页</a>
<a href="bookServlet?method=getBooks&pageNo=${bookpage.totalPageNumber }">末页</a>
</c:if>
转到<input type="text" size="1" id="pageNo"/>页
</center>
</body>
</html>
二、把请求参数封装为CriteriaBook对象、
请求-》servlet-》getBooks方法--》把请求封装进CriteriaBook对象--》调用getPage方法-(此方法返回的是一个page对象调用的是Page对象的方法)--》DaoImpl给Page对象的方法属性赋值
---区间分页要求有隐藏域
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<script type="text/javascript" src="scripts/jquery-1.7.2.js">
</script>
<script type="text/javascript">
$(function(){
//为所有的超链接都加一个点击事件 获取隐藏域的值 AJAX方法serialize序列化
$("a").each(function(){
this.onclick=function(){
var serializeVal=$(":hidden").serialize();
var href=this.href+"&"+serializeVal;
window.location.href=href;
return false;
};
});
});
</script>
<input type="hidden" name="minPrice" value="${param.minPrice }"/>
<input type="hidden" name="maxPrice" value="${param.maxPrice }"/>
public class BookService {
private BookDAO bookDAO=new BookDAOImpl();
public Page<Book> getPage(CriteriaBook criteriabook){
return bookDAO.getPage(criteriabook);
}
public class BookDAOImpl extends BaseDAO<Book> implements BookDAO {
@Override//根据id 获取书本信息
public Book getBook(int id) {
String sql = "SELECT id, author, title, price, publishingDate, " +
"salesAmount, storeNumber, remark FROM mybooks WHERE id = ?";
return query(sql, id);
}
//3.
@Override
public Page<Book> getPage(CriteriaBook cb) {
Page<Book> page = new Page<>(cb.getPageNo());
page.setTotalItemNumber(getTotalBookNumber(cb));
//验证
cb.setPageNo(page.getPageNo());
page.setList(getPageList(cb, 3));
return page;
}
//1. 获取所有书的数量
@Override
public long getTotalBookNumber(CriteriaBook cb) {
String sql = "SELECT count(id) FROM mybooks WHERE price >= ? AND price <= ?";
return getSingleVal(sql, cb.getMinPrice(), cb.getMaxPrice());
}
//2.
/**
* MySQL分页使用LIMIT, 其中索引fromIndex 从0开始
*/
@Override
public List<Book> getPageList(CriteriaBook cb, int pageSize) {
String sql = "SELECT id, author, title, price, publishingDate, " +
"salesAmount, storeNumber, remark FROM mybooks " +
"WHERE price >= ? AND price <= ? " +
"LIMIT ?, ?";
return queryForList(sql, cb.getMinPrice(), cb.getMaxPrice(),
(cb.getPageNo() - 1) * pageSize, pageSize);
}
package com.greatest.mvcapp.web;
import java.util.List;
public class Page<T> {
//当前第几页
private int pageNo;
//当前页的 List
private List<T> list;
//每页显示多少条记录
private int pageSize = 5;
//共有多少条记录
private long totalItemNumber;
//构造器中需要对 pageNo 进行初始化
public Page(int pageNo) {
super();
this.pageNo = pageNo;
}
//需要校验一下
public int getPageNo() {
if(pageNo <0)
pageNo = 1;
if(pageNo > getTotalPageNumber()){
pageNo = getTotalPageNumber();
}
return pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setList(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
//获取总页数
public int getTotalPageNumber(){
int totalPageNumber = (int)totalItemNumber / pageSize;
if(totalItemNumber % pageSize != 0){
totalPageNumber++;
}
return totalPageNumber;
}
public void setTotalItemNumber(long totalItemNumber) {
this.totalItemNumber = totalItemNumber;
}
public boolean isHasNext(){
if(getPageNo() < getTotalPageNumber()){
return true;
}
return false;
}
public boolean isHasPrev(){
if(getPageNo() > 1){
return true;
}
return false;
}
public int getPrevPage(){
if(isHasPrev()){
return getPageNo() - 1;
}
return getPageNo();
}
public int getNextPage(){
if(isHasNext()){
return getPageNo() + 1;
}
return getPageNo();
}
}