使用范围 下面有分页选项的时候 有一个PageBean就可以对该列表进行多种不同分页查询
PageBean对象的创建 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class PageBean <T> { private int pageNow; private int totalRecords; private int pageSize; private String url; private List<T> beanList; public int getPageCount () { int pageCount = totalRecords / pageSize; return totalRecords % pageSize == 0 ? pageCount : pageCount + 1 ; } public int getPageNow () { return pageNow; } public void setPageNow (int pageNow) { this .pageNow = pageNow; } public int getTotalRecords () { return totalRecords; } public void setTotalRecords (int totalRecords) { this .totalRecords = totalRecords; } public int getPageSize () { return pageSize; } public void setPageSize (int pageSize) { this .pageSize = pageSize; } public String getUrl () { return url; } public void setUrl (String url) { this .url = url; } public List<T> getBeanList () { return beanList; } public void setBeanList (List<T> beanList) { this .beanList = beanList; } }
封装每页记录数的类 1 2 3 4 public class PageConstants { public static final int BOOK_PAGE_SIZE = 12 ; public static final int ORDER_PAGE_SIZE = 8 ; }
Dao层 通用的查询方法 通用的查询方法只需要对应查询传过来sql语句与pageNow即可返回封装好的PagebBean对象与查询对象的List集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public PageBean<Book> findByCriteria (String sql, int pageNow) { int pageSize = PageConstants.BOOK_PAGE_SIZE; int totalRecords = 0 ; List<Book> list = template.query(sql,new BeanPropertyRowMapper <>(Book.class)); for (Book book :list){ totalRecords++; } sql = sql+" order by orderBy limit ?,?" ; List<Book> beanList = template.query(sql,new BeanPropertyRowMapper <>(Book.class), (pageNow-1 ) * pageSize,pageSize); PageBean<Book> pb = new PageBean <>(); pb.setBeanList(beanList); pb.setPageNow(pageNow); pb.setPageSize(pageSize); pb.setTotalRecords(totalRecords); return pb; }
例如 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public PageBean<Book> findByBname (String bname, int pageNow) { String sql="select * from t_book where bname like '%" + bname + "%'" ; return findByCriteria(sql,pageNow); } public PageBean<Book> findByCombination (Book criteria, int pageNow) { String sql="select * from t_book where 1=1 " ; if (!"" .equals(criteria.getBname())){ sql = sql+ "AND bname like '%" + criteria.getBname() +"%'" ; } if (!"" .equals(criteria.getAuthor())){ sql = sql+ "AND author like '%" + criteria.getAuthor() +"%'" ; } if (!"" .equals(criteria.getPress())){ sql = sql+ "AND press like '%" + criteria.getPress() +"%'" ; } return findByCriteria(sql, pageNow); }
Service层 直接调用相应方法即可
1 2 3 4 5 6 7 public PageBean<Book> findByBname (String bname, int pageNow) { return bookDao.findByBname(bname,pageNow); } public PageBean<Book> findByCombination (Book book, int pageNow) { return bookDao.findByCombination(book,pageNow); }
Servlet层 获取当前页码 1 2 3 4 5 6 7 8 9 10 11 12 private int getPageNow (HttpServletRequest req) { int pageNow = 1 ; String param = req.getParameter("pageNow" ); if (param != null && !param.trim().isEmpty()) { pageNow = Integer.parseInt(param); } return pageNow; }
获取需要分页的url 1 2 3 4 5 6 7 8 9 10 11 12 13 14 private String getUrl (HttpServletRequest req) { String url = req.getRequestURI() + "?" + req.getQueryString(); int index = url.lastIndexOf("&pageNow=" ); if (index != -1 ) { url = url.substring(0 , index); } return url; }
例如 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public String findByBname (HttpServletRequest req, HttpServletResponse resp) { int pageNow = getPageNow(req); String url = getUrl(req); String bname = req.getParameter("bname" ); PageBean<Book> pb = bookService.findByBname(bname, pageNow); pb.setUrl(url); req.setAttribute("pb" , pb); return "f:/jsps/book/list.jsp" ; } public String findByCombination (HttpServletRequest req, HttpServletResponse resp) { int pageNow = getPageNow(req); String url = getUrl(req); Book book = new Book (); book.setBname(req.getParameter("bname" )); book.setAuthor(req.getParameter("author" )); book.setPress(req.getParameter("press" )); PageBean<Book> pb = bookService.findByCombination(book, pageNow); pb.setUrl(url); req.setAttribute("pb" , pb); return "f:/jsps/book/list.jsp" ; }
Jsp页面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <script > function _go ( ) { var pageNow = $("#pageCode" ).val (); if (!/^[1-9]\d*$/ .test (pageNow)) { alert ('请输入正确的页码!' ); return ; } if (pageNow > ${pb.pageCount }) { alert ('请输入正确的页码!' ); return ; } location = "${pb.url}&pageNow=" + pageNow; } </script > <div class ="divBody" > <div class ="divContent" > <%--上一页 --%> <c:choose > <c:when test ="${pb.pageNow eq 1 }" > <span class ="spanBtnDisabled" > 上一页</span > </c:when > <c:otherwise > <a href ="${pb.url}&pageNow=${pb.pageNow-1}" class ="aBtn bold" > 上一页</a > </c:otherwise > </c:choose > <%-- 我们需要计算页码列表的开始和结束位置,即两个变量begin和end 计算它们需要通过当前页码! 1. 总页数不足6页--> begin=1, end=最大页 2. 通过公式设置begin和end,begin=当前页-1,end=当前页+3 3. 如果begin<1,那么让begin=1,end=6 4. 如果end>tp, 让begin=pageCount-5, end=pageCount --%> <c:choose > <%--1. 总页数不足6页--> begin=1, end=最大页--%> <c:when test ="${pb.pageCount <= 6}" > <c:set var ="begin" value ="1" > </c:set > <c:set var ="end" value ="${pb.pageCount}" > </c:set > </c:when > <c:otherwise > <%--2. 通过公式设置begin和end,begin=当前页-1,end=当前页+3--%> <c:set var ="begin" value ="${pb.pageNow-2}" > </c:set > <c:set var ="end" value ="${pb.pageNow+3}" > </c:set > <%--3. 如果begin<1,那么让begin=1,end=6--%> <c:if test ="${begin <= 1}" > <c:set var ="begin" value ="1" > </c:set > <c:set var ="end" value ="6" > </c:set > </c:if > <%--4. 如果end>tp, 让begin=pageCount-5, end=pageCount--%> <c:if test ="${end >= pb.pageCount}" > <c:set var ="begin" value ="${pb.pageCount-5}" > </c:set > <c:set var ="end" value ="${pb.pageCount}" > </c:set > </c:if > </c:otherwise > </c:choose > <%--开始根据获取到的begin和end来遍历生成页码--%> <c:forEach begin ="${begin}" end ="${end}" var ="i" > <c:choose > <%--如果是本页面就不生成链接--%> <c:when test ="${pb.pageNow eq i}" > <span class ="spanBtnSelect" > ${i}</span > </c:when > <c:otherwise > <a href ="${pb.url}&pageNow=${i}" class ="aBtn" > ${i}</a > </c:otherwise > </c:choose > </c:forEach > <%-- 显示点点点 --%> <c:if test ="${end < pb.pageCount}" > <span class ="spanApostrophe" > ...</span > </c:if > <%--下一页 --%> <c:choose > <c:when test ="${pb.pageNow eq pb.pageCount }" > <span class ="spanBtnDisabled" > 下一页</span > </c:when > <c:otherwise > <a href ="${pb.url}&pageNow=${pb.pageNow+1}" class ="aBtn bold" > 下一页</a > </c:otherwise > </c:choose > <%-- 共N页 到M页 --%> <span > 共${pb.pageCount}页</span > <span > 到</span > <input type ="text" class ="inputPageCode" id ="pageCode" value ="${pb.pageNow}" /> <span > 页</span > <a href ="javascript:_go();" class ="aSubmit" > 确定</a > </div > </div >
使用时在jsp页面中导如即可
比如
1 <%@include file="/jsps/pager/pager.jsp" %>