實現分頁 包括 區間查詢分頁
阿新 • • 發佈:2018-11-04
一、獲取請求引數 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();
}
}