首先,在util包里面我们先建立一个Page类,用于存放分页查到的列表以及每页行数以及最大页与当前页。
package com.hpe.muke.util;
import java.util.List;
public class Page {
// 将分页查询的数据以及分页信息 一块返回到前台页面中
private int count ; // 一页显示的记录条数
private int pageNum; // 当前页码
private int maxNum; // 最大页码
private List list; // 查询到的数据
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getMaxNum() {
return maxNum;
}
public void setMaxNum(int maxNum) {
this.maxNum = maxNum;
}
}
然后再DBUtil.java中,书写查询函数。目的是返回按条件查找到的某一页所用记录。比如第二页的三条记录。
public Page query(String sql,Object[] params,Page page){
//sql为传进来的查询所有语句,比如select * from user
List all=query(sql,params);
all.size();//总页数,也就是最大页数
int maxNum=(all.size()+page.getCount()-1)/page.getCount();//获得最大页码数。
page.setMaxNum(maxNum);
sql+=" limit "+(page.getPageNum()-1)*page.getCount()+","+page.getCount()+" ";//与sql语句做链接形成完成limt语句
//(page.getPageNum()-1)*page.getCount()是起始语句页,getPageNum是获取当前页码。limit返回第一页是0开始的
//page.getCount()是步长,也就是每页记录数 。
List list=query(sql,params);page.setList(list);return page;}
user为user表中的记录数;
Count是limit 0,3 中的3,代表每页查询到记录数
Size是总的表总记录数
(在list 0,3)maxNum=size/count:为当limit 0,3 时候,直接运算得到的页码结果
(size+count-1)/count:是经过调整以后得到的页码结果。
User (在list 0,3)maxNum=size/count (size+count-1)/count
1 1/3=0 (1+(3-1))/3=1
2 2/3=0 (2+(3-1))/3=1
3 3/3=1 (3+(3-1))/3=1
4 4/3=1 (4+(3-1))/3=2
5 5/3=1 (5+(3-1))/3=2
6 6/3=2 (6+(3-1))/3=2
7 7/3=2 (7+(3-1))/3=2
显然,(size+count-1)/count得到的结果是我们想过要的。
在Dao.java的search函数中:
public Page search(String key, String realname, int theid, Page page) {
// TODO Auto-generated method stub
//sql是做查询总记录语句
String sql = "select * from message , user where message.userid = `user`.userid and msgtopic like ? ";
ArrayList<Object> params = new ArrayList<>();
params.add("%"+key+"%");
/*
* 姓名过滤 和 主题过滤都使用=
* 1. 当姓名为空时, 不需要 and realname = ?
* 2. 主题ID <=0时, 不需要 and theid = ?
*/
if (realname != null && realname.length() > 0){
sql += " and realname = ? ";
params.add(realname);
}
if (theid>0){
sql += " and theid = ? ";
params.add(theid);
}
//这里db.query函数将sql查询所有语句,以及需要用到的参数,还是存储查询结果的实体类函数一并存储
return db.query(sql, params.toArray(),page);
}
在servlet.java中调用
Page page=new Page();
page.setCount(1);//设置步长,也就是一页显示多少条记录
page.setPageNum(Integer.parseInt(pageNum));//获得当前页
Page p=ims.search(key, realname, Integer.parseInt(theid), page);
request.setAttribute("page", page);
request.getRequestDispatcher("admin/message.jsp").forward(request, response);
然后是jsp中显示。
代码1:上一页图标
<c:if test="${requestScope.page.pageNum<=1}">
<li><a>上一页</a></li>
</c:if>
<c:if test="${requestScope.page.pageNum>1}">
<li class="disabled"><a
href="messageServlet?action=search&pageNum=${requestScope.page.pageNum-1}">上一页</a></li>
</c:if>
代码2:中间显示第几页图标
<c:forEach var="i" begin="${requestScope.page.pageNum }" end="${requestScope.page.pageNum+2}" step="1">
<c:if test="${i-1>0 }"> <!-- 下限 -->
<c:if test="${i-1<requestScope.page.maxNum }"><!-- 上限 -->
<c:if test="${i-1== requestScope.page.pageNum}"><!-- 当前页 -->
<li class="active"><a>${i-1}</a></li><!-- 当前页显示蓝色选中 -->
</c:if>
<c:if test="${i-1!= requestScope.page.pageNum}"><!-- 非当前页显示其他色,并有连接 -->
<li><a href="messageServlet?action=search&pageNum=${i-1}">${i-1}</a></li>
</c:if>
</c:if>
</c:if>
</c:forEach>
代码3:显示下一页图标
<c:if test="${requestScope.page.pageNum<requestScope.page.maxNum}"><!-- 上限 -->
<li><a
href="messageServlet?action=search&pageNum=${requestScope.page.pageNum+1}">下一页</a></li>
</c:if>
<c:if test="${requestScope.page.pageNum>=requestScope.page.maxNum}">
<li><a>下一页</a></li>
</c:if>