分页模型图分析:
分页模型 Page 的抽取(当前页数,总页数,总记录数, 当前页数据,每页记录数)
package pojo;
import java.util.List;
/**
* page是分页的模型对象
* @param <T> 是具体的模块的javabean
*/
public class Page <T>{
public static final Integer PAGE_SIZE = 4;
private Integer pageNo;
private Long pageTotal;
private Long getTotalCount;
private Integer pageSize=PAGE_SIZE;
private List<T> items;
private String url;
public Page() {
}
public Integer getPageNo() {
return pageNo;
}
public void setPageNo(Integer pageNo) {
this.pageNo = pageNo;
}
public Long getPageTotal() {
return pageTotal;
}
public void setPageTotal(Long pageTotal) {
this.pageTotal = pageTotal;
}
public Long getGetTotalCount() {
return getTotalCount;
}
public void setGetTotalCount(Long getTotalCount) {
this.getTotalCount = getTotalCount;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Page{" +
"pageNo=" + pageNo +
", pageTotal=" + pageTotal +
", getTotalCount=" + getTotalCount +
", pageSize=" + pageSize +
", items=" + items +
", url='" + url + '\'' +
'}';
}
}
page分页的Servlet程序
protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//分页查询
//页数
int pageNo = WebUtils.paraseInt(req.getParameter("pageNo"),1);
//一页多少内容
int pageSize = WebUtils.paraseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
//要传进去的servlet程序的url
String url = "manager/bookServlet?action=page";
//获得图书信息
Page<Book> page = book.page(pageNo,pageSize,url);
System.out.println(page);
//将图书信息保存到request域中
req.setAttribute("book",page);
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
Dao包:
List<Book> queryForitems(int begin,int pageSize);public List<Book> qurtyForPageItems(int begin, int pageSize, int min, int max) { String sql = "select id,name,author,price,sales,stock,img_path from " + "t_book where price between ? and ? order by price limit ?,? "; return queryMore(Book.class,sql,min,max,begin,pageSize); }
Service包:
Page<Book> page(int pageNo, int pageSize,String url);
public Page<Book> page(int pageNo, int pageSize,String url) { //创建page对象 Page<Book>page = new Page<Book>(); //设置要转发到那个url中的servlet程序 page.setUrl(url); //设计每页数量 page.setPageSize(pageSize); //获取总记录数 即总共多少本书 Long i = booker.queryForPageTotalCount(); //设置总记录数 即总共多少本书 page.setGetTotalCount(i); //获取总页码 Long total = i/pageSize; if(i%pageSize>0){ total++; } //设置总页码 page.setPageTotal(total); //数据边界的有效检查 if(pageNo<1){ pageNo=1; }else if(pageNo>total){ pageNo= Math.toIntExact(total); } page.setPageNo(pageNo); //分页查询的begin int begin = (page.getPageNo()-1)*pageSize; //分页查询完后返回来的对象 List<Book> books = booker.queryForitems(begin, pageSize); //将这个对象保存在page中的list对象中 page.setItems(books); return page; }
首页、上一页、下一页、末页实现,分页模块中跳转到指定页数功能
<div id="page_nav"> <%--大于首页,才显示--%> <c:if test="${requestScope.book.pageNo > 1}"> <a href="${ requestScope.book.url }&pageNo=1">首页</a> <a href="${ requestScope.book.url }&pageNo=${requestScope.book.pageNo-1}">上一页</a> </c:if> <%--页码输出的开始--%> <c:choose> <%--情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%> <c:when test="${ requestScope.book.pageTotal <= 5 }"> <c:set var="begin" value="1"/> <c:set var="end" value="${requestScope.book.pageTotal}"/> </c:when> <%--情况2:总页码大于5的情况--%> <c:when test="${requestScope.book.pageTotal > 5}"> <c:choose> <%--小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.--%> <c:when test="${requestScope.book.pageNo <= 3}"> <c:set var="begin" value="1"/> <c:set var="end" value="5"/> </c:when> <%--小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4 - 总页码--%> <c:when test="${requestScope.book.pageNo > requestScope.book.pageTotal-3}"> <c:set var="begin" value="${requestScope.book.pageTotal-4}"/> <c:set var="end" value="${requestScope.book.pageTotal}"/> </c:when> <%--小情况3:4,5,6,7,页码范围是:当前页码减2 - 当前页码加2--%> <c:otherwise> <c:set var="begin" value="${requestScope.book.pageNo-2}"/> <c:set var="end" value="${requestScope.book.pageNo+2}"/> </c:otherwise> </c:choose> </c:when> </c:choose> <c:forEach begin="${begin}" end="${end}" var="i"> <c:if test="${i == requestScope.book.pageNo}"> 【${i}】 </c:if> <c:if test="${i != requestScope.book.pageNo}"> <a href="${ requestScope.book.url }&pageNo=${i}">${i}</a> </c:if> </c:forEach> <%--页码输出的结束--%> <%-- 如果已经 是最后一页,则不显示下一页,末页 --%> <c:if test="${requestScope.book.pageNo < requestScope.book.pageTotal}"> <a href="${ requestScope.book.url }&pageNo=${requestScope.book.pageNo+1}">下一页</a> <a href="${ requestScope.book.url }&pageNo=${requestScope.book.pageTotal}">末页</a> </c:if> 共${ requestScope.book.pageTotal }页,${ requestScope.book.getTotalCount }条记录 到第<input value="${param.pageNo}" name="pn" id="pn_input"/>页 <input id="searchPageBtn" type="button" value="确定"> <script type="text/javascript"> $(function () { // 跳到指定的页码 $("#searchPageBtn").click(function () { var pageNo = $("#pn_input").val(); <%--var pageTotal = ${requestScope.page.pageTotal};--%> <%--alert(pageTotal);--%> // javaScript语言中提供了一个location地址栏对象 // 它有一个属性叫href.它可以获取浏览器地址栏中的地址 // href属性可读,可写 location.href = "${pageScope.basePath}${ requestScope.book.url }&pageNo=" + pageNo; }); }); </script> </div>
分页模块中,页码 1,2,【3】,4,5 的显示,要显示 5 个页 码,并且页码可以点击跳转。
情况 1:如果总页码小于等于 5 的情况,
页码的范围是:1-总页码
1 页 1
2 页 1,2
3 页 1,2,3
4 页 1,2,3,4
5 页 1,2,3,4,5
情况 2:总页码大于 5 的情况。假设一共 10 页
小情况 1:当前页码为前面 3 个:1,2,3 的情况,
页码范围是:1-5. 【1】2,3,4,5
1【2】3,4,5
1,2【3】4,5
小情况 2:当前页码为最后 3 个,8,9,10,
页码范围是:总页码减 4 - 总页码
6,7【8】9,10
6,7,8【9】10
6,7,8,9【10】
小情况 3:4,5,6,7,页码范围是:当前页码减 2 - 当前页码加 2
2,3,4,5,6
3,4,5,6,7
4,5,6,7,8
5,6,7,8,9
<c:choose> <%--情况1:如果总页码小于等于5的情况,页码的范围是:1-总页码--%> <c:when test="${ requestScope.book.pageTotal <= 5 }"> <c:set var="begin" value="1"/> <c:set var="end" value="${requestScope.book.pageTotal}"/> </c:when> <%--情况2:总页码大于5的情况--%> <c:when test="${requestScope.book.pageTotal > 5}"> <c:choose> <%--小情况1:当前页码为前面3个:1,2,3的情况,页码范围是:1-5.--%> <c:when test="${requestScope.book.pageNo <= 3}"> <c:set var="begin" value="1"/> <c:set var="end" value="5"/> </c:when> <%--小情况2:当前页码为最后3个,8,9,10,页码范围是:总页码减4 - 总页码--%> <c:when test="${requestScope.book.pageNo > requestScope.book.pageTotal-3}"> <c:set var="begin" value="${requestScope.book.pageTotal-4}"/> <c:set var="end" value="${requestScope.book.pageTotal}"/> </c:when> <%--小情况3:4,5,6,7,页码范围是:当前页码减2 - 当前页码加2--%> <c:otherwise> <c:set var="begin" value="${requestScope.book.pageNo-2}"/> <c:set var="end" value="${requestScope.book.pageNo+2}"/> </c:otherwise> </c:choose> </c:when> </c:choose> <c:forEach begin="${begin}" end="${end}" var="i"> <c:if test="${i == requestScope.book.pageNo}"> 【${i}】 </c:if> <c:if test="${i != requestScope.book.pageNo}"> <a href="${ requestScope.book.url }&pageNo=${i}">${i}</a> </c:if> </c:forEach> <%--页码输出的结束--%>