分页之页面页码列表计算
我们通过看百度的分页可以发现以下规律:
1.最多显示10个页码;
2.当前页在页码中的位置定为六;
所以只需要当前页码来定出来页码列表,定下来页码列表只需要两个数据:begin,end;
需要使用pc(当前页码)来推算出begin和end:
begin=pc-5;
end=pc+4;
计算公式:
如果总页数<=10(列表长度),那么begin=1,end=10;否则使用计算公式:begin=pc-5以及end=pc+4;但是这样也会导致头溢出和尾溢出。
头溢出:当begin<1时,让begin=1,end=10;
尾溢出:当end=${tp(总页数)}时,让end=tp;
代码实现:
1.首先要创建一个pagebean:
package pages;
import java.util.List;
public class PageBean<T> {
private int pc;//当前页码page code
// private int tp;//总页数=总记录数/每页记录数
private int tr;//总记录数
private int ps;//每页记录数
private List<T> beanlist;//当前页的记录
public int getPc() {
return pc;
}
public void setPc(int pc) {
this.pc = pc;
}
public int getTp() {
int num=tr/ps;
int tp=tr%ps;
return tp==0?num:num+1;
}
public int getTr() {
return tr;
}
public void setTr(int tr) {
this.tr = tr;
}
public int getPs() {
return ps;
}
public void setPs(int ps) {
this.ps = ps;
}
public List<T> getBeanlist() {
return beanlist;
}
public void setBeanlist(List<T> beanlist) {
this.beanlist = beanlist;
}
@Override
public String toString() {
return "PageBean [pc=" + pc + ", tr=" + tr + ", ps=" + ps + ", beanlist=" + beanlist + "]";
}
}
2.servlet层:
public String findall(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.获取页面传递的pc
* 2.给定ps的值
* 3.使用pc和ps调用service方法,得到pagebean对象,保存到request域
* 4.转发到list.jsp
*/
int pc=getpc(request);
int ps=10;
PageBean<customer> pb=customerservice.findall(pc,ps);
request.setAttribute("pb", pb);
return "f:/list.jsp";
}
/*
* 获取pc
*/
public int getpc(HttpServletRequest request){
String value=request.getParameter("pc");
if(value==null||value.trim().isEmpty()){
return 1;
}
return Integer.parseInt(value);
}
3.service层:
public PageBean<customer> findall(int pc, int ps){
return customerdao.findall(pc,ps);
}
4.dao层:
/*
* 查询所有
*/
public PageBean<customer> findall(int pc, int ps){
try {
PageBean<customer> pb=new PageBean<customer>();
pb.setPc(pc);
pb.setPs(ps);
/*
* 得到tr
*/
String sql="select count(*) from t_customers";
Number trnum=(Number)qr.query(sql, new ScalarHandler());
int tr=trnum.intValue();
pb.setTr(tr);
/*
* 得到beanlist
*/
String sql1="select * from t_customers order by cname limit ?,?";
List<customer> beanlist=qr.query(sql1, new BeanListHandler<customer>(customer.class),
(pc-1)*ps,ps);
pb.setBeanlist(beanlist);
return pb;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
4.jsp页面的设置:
第${pb.pc}页/供${pb.tp}页
<center>
<a href="<c:url value='/customerServlet?method=findall&pc=1'/>">首页</a>
<c:if test="${pb.pc>1}">
<a href="<c:url value='/customerServlet?method=findall&pc=${pb.pc-1}'/>">上一页</a>
</c:if>
<!-- 计算begin和end -->
<c:choose>
<!-- 当总页数不足10时,全部显示出来 -->
<c:when test="${pb.tp<=10}">
<c:set var="begin" value="1"/>
<c:set var="end" value="${pb.tp}"/>
</c:when>
<!--当总页数大于10时,按公式计算 -->
<c:otherwise>
<c:set var="begin" value="${pb.pc-5}"/>
<c:set var="end" value="${pb.pc+4}"/>
<!--头溢出时 -->
<c:if test="${begin<1}">
<c:set var="begin" value="1"/>
<c:set var="end" value="10"/>
</c:if>
<!--尾溢出时 -->
<c:if test="${end>pb.tp}">
<c:set var="begin" value="${pb.tp-9}"/>
<c:set var="end" value="${pb.tp}"/>
</c:if>
</c:otherwise>
</c:choose>
<!-- 循环遍历显示所有页码列表 -->
<c:forEach var="i" begin="${begin}" end="${end}">
<c:choose>
<c:when test="${i eq pb.pc}">
[${i}]
</c:when>
<c:otherwise>
<a href="<c:url value='/customerServlet?method=findall&pc=${i}'/>">[${i}]</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pb.pc<tp}">
<a href="<c:url value='/customerServlet?method=findall&pc=${pb.pc+1}'/>">下一页</a>
</c:if>
<a href="<c:url value='/customerServlet?method=findall&pc=${pb.tp}'/>">尾页</a>
</center>
来源:https://www.cnblogs.com/java-7/p/7832497.html