分页之页面页码列表计算

懵懂的女人 提交于 2020-02-02 13:43:06

分页之页面页码列表计算

我们通过看百度的分页可以发现以下规律:

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>

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!