AJAX实现分页--模拟百度搜索分页

第一部分:效果与分析

1.百度分页组件:

 2.自己实现的分页:

3.分析:

  百度搜索分页,如果总页数大于10,用户最多只能看到10页内容,不足10页显示全部,当点击下一页时,数字页标向前移动一个单位,当点击上一页时向后移动一个单位。

第二部分:后台实现:

1.实现思路:

  后台的处理思想是这样的,通过AJAX向后台发送请求,携带一个分页对象PageBean传过去,查询完毕后返回一个新的PageBean对象。

前台传入的PageBean对象参数:

属性 名称 是否必须 默认值
pageSize 每页数据量 非必须 30
currentPage 当前页【用户要取的页】 必须 1
key 关键词 非必须  null

后台处理后获得的PageBean对象:

属性 名称 是否必须 默认值
pageSize 每页数据量    
currentPage 当前页【用户要取的页】    
key 关键词    
totalRows 总行数    
totalPages 总页数    
data 数据    

请求参数Demo:{pageSize:10,currentPage:1},获取第一页数据,每页10条。

获取数据Demo:{}。

2.后台处理方法,JAVA实现,此方法传入PageBean对象,获取数据后返回PageBaen对象,前台AJAX请求需要经过中间的控制器来调用此方法,并将数据转换为JSON对象。控制器可用Servlet/Struts/SpringMVC等实现。


/**
* 分页方法
* @param @param page (传入分页对象),传入每页大小pageSize和需要第几页currentPage
* @param @return
* @return PageBean
* @throws
**/

public PageBean findByPage(PageBean page) {

// TODO Auto-generated method stub
        int pageSize = page.getPaseSize()!=0?page.getPaseSize():30; //每页数据条数;
        int currentPage = page.getCurrentPage()>0?page.getCurrentPage():1;//当前第几页
        int totalRows = 0; //总的记录数
        int totalPages = 0 ;//总的页数
        List<Map<String, Object>> datas = null;
        //查询条件,通过map的方式传入
        Map<String, Object> map = new HashMap<String, Object>();
        //获取总的记录数
        int _totalRows = getSqlSession().selectOne(getMapperFullName("findTotalRows"),map);
        if(_totalRows==0){
            //没有数据
            return null;
        }else{
            totalRows = _totalRows;
        }
        //计算总的页数
        if(_totalRows%pageSize==0){
            totalPages = _totalRows/pageSize;
        }else{
            totalPages = _totalRows/pageSize+1;
        }
        //判断当前页是否大于总的页数,如果大于则返回最后一页数据
        int start = 0;
        int limit = pageSize;
        //当请求的页数大于总页数时,返回最后一页数据
        if(currentPage>totalPages){
            start = (totalPages-1)*pageSize;
        }else{
            start = (currentPage-1)*pageSize;
        }
        map.put("start", start);
        map.put("limit", limit);
        datas = getSqlSession().selectList(getMapperFullName("find"), map);
        //查询完毕,设置数据并返回结果
        page.setCurrentPage(currentPage>totalPages?totalPages:currentPage);
        page.setData(datas);
        page.setPaseSize(pageSize);
        page.setTotalPages(totalPages);
        page.setTotalRows(totalRows);
        return page;
    }

3.PageBean.java

public class PageBean {

    protected int paseSize; //每页数据量

    protected int currentPage; //当前页
+
    protected int totalRows; //总记录书

    protected int totalPages; //总页数

    private List<?> data; //数据
    
    public PageBean() {}
}

 4.Spring控制器:

    @ResponseBody  //此注解自动会将page转为JSON
    @RequestMapping("page")
    public PageBean findByPage(HttpServletRequest request,HttpServletResponse response,PageBean page){
        return this.userService.findByPage(page);
    }

第二部分:前台实现,使用html和js

1.index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> base page </title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <script type="text/javascript" src="jquery-1.7.2.js"></script>
  <script type="text/javascript" src="jquery.tmpl.js"></script>
  <script type="text/javascript" src="basepage.js"></script>
  <style type="text/css">
      .box{
          width: 750px;
          margin: 0 auto;
      }
      .page{
          padding: 10px 0px 10px 5px;
          margin:5px 0px;
          width: 100%;
      }
      /*分页链接的样式*/
      .page-a{
          color: blue;
          text-decoration: none;
          border:1px solid #CCC;
          padding:5px 5px;
      }
      .page-a:HOVER {
        border: 1px #0099cc solid;
    }
    /**当前页的文本样式**/
    .page-curr-text{
        color: black;
        font-weight: bold;
    }
  </style>
 </head>
 <body>
 <div class="box">
   <!--数据-->
  <table id="tab" border="0" style="width:100%;border: 1px solid #CCC;" cellpadding="5" cellspacing="1" bgcolor="#CCCCCC">
  </table>
   <!--分页组件-->
  <div class="page"></div>
 </div>
   <!--数据模版-->
<script id="tmpl" type="text/x-jquery-tmpl">
    <tr bgcolor="#FFFFFF">
        <td>${id}</td>
        <td>${name}</td>
        <td>${sex}</td>
        <td>${birthday}</td>
    </tr>
</script>
 </body>
</html>

2.basepage.js

/**AJAX分页获取数据**/
function getData(_currentPage){
    $.ajax({
        url:'http://localhost:8089/user/action/page',
        type:'post',
        dataType:'jsonp',
        contentType: 'application/json;charset=utf-8',
        data:{currentPage:_currentPage,paseSize:5},
        error:function(){
            alert("request error!");
        },
        success:function(json){

            /**设置数据**/
            var data = json.data;
            /**使用jQuery模版
            $("#tab").html($("#tmpl").tmpl(data));
            
            /**生成一个分页工具栏组件**/
            var tools = ""; //定义分页html
            //json数据
            var toolsData = {currentPageX:json.currentPage,paseSizeX:json.paseSize,totalPagesX:json.totalPages,totalRowsX:json.totalRows};
            //共几页
            var totlaBar ="<a class=''>共"+toolsData.totalPagesX+"页</a>&nbsp;";
            //首页
            var first ="<a class='page-a' href='javascript:void(0);' onclick='getData(1)'>首页</a>&nbsp;";
            //上一页
            var prev ="<a class='page-a' href='javascript:void(0);' onclick='getData("+(toolsData.currentPageX-1)+")'>&lt;上一页</a>&nbsp;";
            //中间带数字的页
            var page = "";
            var t = 10;  //用户最多看到10页
            var c = toolsData.currentPageX; //当前第几页
            //总页数小于10显示全部
            if(toolsData.totalPagesX<=10){
                for(var i=1;i<toolsData.totalPagesX+1;i++){
                    page = page + addPage(c,i);
                }    
            }else{
                //总页数大于10
                if(c<=6){
                    for(var i=1;i<c+1;i++){
                        page = page + addPage(c,i);
                    }
                    for(var i=c+1;i<c+(t-c)+1;i++){
                        page = page + addPage(c,i);
                    }
                }else if(c>6 && c<=toolsData.totalPagesX-5){
                    for(var i=c-5;i<c+1;i++){
                        page = page + addPage(c,i);
                    }
                    for(var i=c+1;i<c+5;i++){
                        page = page + addPage(c,i);
                    }
                }else{
                    for(var i=c-(t-(toolsData.totalPagesX-c)-1);i<c;i++){
                        page = page + addPage(c,i);
                    }
                    for(var i=c;i<toolsData.totalPagesX+1;i++){
                        page = page + addPage(c,i);
                    }
                }
            }
            //下一页
            var next ="<a class='page-a' href='javascript:void(0);' onclick='getData("+(toolsData.currentPageX+1)+")'>下一页&gt;</a>&nbsp;";
            //尾页
            var last ="<a class='page-a' href='javascript:void(0);' onclick='getData("+(toolsData.totalPagesX)+")'>尾页</a>&nbsp;";
            
            if(toolsData.currentPageX==1){
                tools =totlaBar+page+next+last;
            }else if(toolsData.currentPageX>1 && toolsData.currentPageX<toolsData.totalPagesX){
                tools = totlaBar+first+prev+page+next+last;
            }else if(toolsData.currentPageX=toolsData.totalPagesX){
                tools = totlaBar+first+prev+page;
            }
            //设置分页工具栏到
            $(".page").html(tools);
        }
    });
    function addPage(index,i){
        var page = "";
        if(index==i){
            page = "<span class='page-curr-text'>"+i+"</span>&nbsp;";
        }else{
            page = "<a class='page-a' href='javascript:void(0);' onclick='getData("+i+");'>"+i+"</a>&nbsp;";
        }
        return page;
    }
};


//测试
$(function(){
   getData(1);
});

至此搞定...


 

posted @ 2014-09-24 20:16  telzhou  阅读(1223)  评论(1编辑  收藏  举报