使用范围

下面有分页选项的时候 有一个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

//分页Bean,它会在各层之间传递!
public class PageBean<T> {
private int pageNow;//当前页码
private int totalRecords;//总记录数
private int pageSize;//每页记录数
private String url;//请求路径和参数,例如:/BookServlet?method=findXXX&cid=1&bname=2
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
//写入sql 返回分页查询结果
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++;
}
//得到beanList,即当前页记录
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<>();
//其中PageBean没有url,这个任务由Servlet完成
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() +"%'";
}
//将sql传入findByCriteria方法即可
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) {
//默认pageNow=1
int pageNow = 1;
String param = req.getParameter("pageNow");
//用来确定传过来的pageNow是否为空 如果不为空就转成整形赋给pageNow
//trim()方法用来返回字符串的副本,忽略前导空白和尾部空白
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
/**
* 截取url,页面中的分页导航中需要使用它做为超链接的目标!
* http://localhost:8080/BookeWeb/user/bookServlet?methed=findByBname&bid=xxx&pageNow=3
* /BookeWeb/user/bookServlet + methed=findByBname&bid=xxx&pageNow=3
*/
private String getUrl(HttpServletRequest req) {
String url = req.getRequestURI() + "?" + req.getQueryString();
//如果url中存在pageNow参数,截取掉,如果不存在那就不用截取。
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) {
//1. 得到pageNow:如果页面传递,使用页面的,如果没传,pageNow=1
int pageNow = getPageNow(req);
//2. 得到url:
String url = getUrl(req);
String bname = req.getParameter("bname");
PageBean<Book> pb = bookService.findByBname(bname, pageNow);
//3. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}

//组合查询
public String findByCombination(HttpServletRequest req, HttpServletResponse resp) {
//1. 得到pageNow:如果页面传递,使用页面的,如果没传,pageNow=1
int pageNow = getPageNow(req);
//2. 得到url:...
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);
//3. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<%-- 共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" %>