欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jquery+Ajax实现简单分页条效果

程序员文章站 2022-06-10 08:27:06
本文实例为大家分享了jquery+ajax实现分页条效果的具体代码,供大家参考,具体内容如下一、如果是jsp页面的话,可以用el表达式和jstl标签制作一个分页条,没有什么难度。用el表达式和jstl...

本文实例为大家分享了jquery+ajax实现分页条效果的具体代码,供大家参考,具体内容如下

一、如果是jsp页面的话,可以用el表达式和jstl标签制作一个分页条,没有什么难度。用el表达式和jstl标签实现的缺点就是无法实现异步效果,整个页面是重新刷新了一遍的。

二、如果是普通的html页面,当然是无法使用el表达式和jstl标签的,这时只能通过异步ajax的方式去实现。当然了,jsp页面两种方式都是可以使用的。

三、分页条,这里我是用ajax和jquery去做的。实现起来比较繁琐,代码特别长,因为都是拼接一大堆的字符串,然后使用html()方法或是append()方法去改变文档的内容。

四、事前分析

浏览器端需要发送给服务器端的参数有两个:

①当前的页码currentpage;
②页面的大小(一页显示几条记录)pagesize。

服务器端给浏览器端发送的是json格式的数据,也就是一个页面实体类pagebean。其中pagebean有如下字段:

①总记录数totalcount;
②总页码totalpage;
③每页的数据 list list;
④当前页码currentpage;
⑤每页显示的记录数pagesize。

这个pagebean支持泛型,代码如下:

public class pagebean<t> 
{
    private int totalcount; // 总记录数
    private int totalpage ; // 总页码
    private list<t> list ; // 每页的数据
    private int currentpage ; //当前页码
    private int rows;//每页显示的记录数,也就是pagesize

    public int gettotalcount() 
    {
        return totalcount;
    }

    public void settotalcount(int totalcount)
    {
        this.totalcount = totalcount;
    }

    public int gettotalpage() 
    {
        return totalpage;
    }

    public void settotalpage(int totalpage) 
    {
        this.totalpage = totalpage;
    }

    public list<t> getlist() 
    {
        return list;
    }

    public void setlist(list<t> list) 
    {
        this.list = list;
    }

    public int getcurrentpage() 
    {
        return currentpage;
    }

    public void setcurrentpage(int currentpage) 
    {
        this.currentpage = currentpage;
    }

    public int getrows() 
    {
        return rows;
    }

    public void setrows(int rows) {
        this.rows = rows;
    }

    @override
    public string tostring() 
    {
        return "pagebean{" +
                "totalcount=" + totalcount +
                ", totalpage=" + totalpage +
                ", list=" + list +
                ", currentpage=" + currentpage +
                ", rows=" + rows +
                '}';
    }
}

要想做到分页,肯定要用到sql语句中的“limit”。举个例子说明一下含义。

select * from student limit 2,5;

具体含义:从student表当中查询数据,从索引为“2”的记录开始查询,往后查5条。

索引是从0开始的,所以上面的语句相当于查询了第3、第4、第5、第6、第7条记录,总共5条记录。

总而言之,第一个数字就是“从哪开始查”的意思,第二个数字就是“往后查几条”的意思。

这里的“从哪开始查”,需要计算出来。公式如下:

(currentpage-1)×pagesize

也就是当前页码减去一,括号,在乘以页面大小。

所以查询语句的伪代码如下:

select * from student limit (currentpage-1)×pagesize,pagesize;

对于总页码totalpage,可以通过总记录数totalcount和页面大小pagesize计算出来。代码如下:

totalpage=totalcount%pagesize==0?totalcount/pagesize:(totalcount/pagesize+1);

五、服务器端主要代码

import com.fasterxml.jackson.databind.objectmapper;
import domain.pagebean;
import domain.rainfall;
import org.springframework.jdbc.core.beanpropertyrowmapper;
import org.springframework.jdbc.core.jdbctemplate;
import util.jdbcutils;

import javax.servlet.servletexception;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
import java.util.list;

@webservlet("/viewrainbypageservlet")
public class viewrainbypageservlet extends httpservlet
{
    protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception
    {
        jdbctemplate template=new jdbctemplate(jdbcutils.getdatasource());
        string sql="select * from rain_fall limit ?,?";//查询部分元组
        string sql2="select * from rain_fall";//查询所有元组
        list<rainfall> countlist = template.query(sql2, new beanpropertyrowmapper<rainfall>(rainfall.class));
        int totalcount=countlist.size();//从数据库获取总记录数
        int totalpage;//先声明一下总的页码,总的页码需要根据客户端发送过来的数据进行计算

        string currentpage = request.getparameter("currentpage");
        string pagesize = request.getparameter("pagesize");
        int intcurrentpage = integer.parseint(currentpage);//用户发来的当前页码
        if(intcurrentpage==0)//用户点击上一页按钮,currentpage就减1,会出现减到0的情况
        {
            intcurrentpage=1;//如果用户的currentpage=0,直接把页码设为1,把第一页的数据返回给客户端
        }

        int intpagesize = integer.parseint(pagesize);//用户发来的页面大小
        totalpage=totalcount%intpagesize==0?totalcount/intpagesize:(totalcount/intpagesize+1);//计算出总的页数
        if(intcurrentpage>totalpage)//用户点击下一页按钮,currentpage就加1,会出现大于总页数的情况
        {
            intcurrentpage=totalpage;//把当前页码设为总页数
        }

        int startindex=(intcurrentpage-1)*intpagesize;//从索引为几的记录开始查询?

        list<rainfall> list = template.query(sql, new beanpropertyrowmapper<rainfall>(rainfall.class),startindex,intpagesize);
        objectmapper mapper=new objectmapper();
        response.setcontenttype("application/json;charset=utf-8");//设置响应数据类型和字符编码
        pagebean<rainfall> pagebean=new pagebean<>();//创建pagebean对象
        //封装pagebean对象
        pagebean.settotalcount(totalcount);
        pagebean.settotalpage(totalpage);
        pagebean.setlist(list);
        pagebean.setcurrentpage(intcurrentpage);
        pagebean.setrows(intpagesize);
        //将数据写回客户端
        system.out.println(pagebean);
        mapper.writevalue(response.getoutputstream(),pagebean);

    }

    protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception
    {

        this.dopost(request, response);

    }
}

六、前端代码(很长)

<%--
  created by yingyong lao.
  user: laoyingyong
  date: 2019-12-10
  time: 19:28
--%>
<%@ page contenttype="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>查看降雨信息</title>
    <!-- 1. 导入css的全局样式 -->
    <link href="css/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jquery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <script>
        $(function () //入口函数
        {
            $.post("viewrainbypageservlet",{currentpage:1,pagesize:5},function (data)//页面加载完成之后发送ajax请求,请求前5条记录,完成界面的初始化
            {
               var totalcount=data.totalcount;//总记录数
               var totalpage=data.totalpage;//总页数
               var currentpage=data.currentpage;//当前页码

                if(currentpage==1)//如果当前页码为1,用户还点击上一页的话,设置class="disabled" ,即出现一个“禁用”图标
                {
                    var str=' <li class="disabled" οnclick="findbypage('+(currentpage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }
                else//否则上一页的按钮就是正常的样式
                {
                    var str=' <li οnclick="findbypage('+(currentpage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }

                for(var i=1;i<=totalpage;i++)//遍历页码,这是两个图标(上一页和下一页)之间的数字
                {
                    if(i==currentpage)//如果当前的这个数字等于当前页码currentpage,就设置class="active",即页码呈高亮样式
                    {
                        var item='<li οnclick="findbypage('+i+',5);" class="active"><a href="#">'+i+'</a></li>';
                    }
                    else
                    {
                        var item='<li οnclick="findbypage('+i+',5);"><a href="#">'+i+'</a></li>';
                    }
                    str=str+item;

                }
                if(currentpage==totalpage)//如果当前页码为最后一页,用户还点击下一页的话,设置class="disabled" ,即出现一个“禁用”图标
                {
                    var strend='<li class="disabled" οnclick="findbypage('+(currentpage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalcount+'条记录,共'+totalpage+'页</span>';

                }
                else //不是最后一页,就是正常的样式
                {
                    var strend='<li οnclick="findbypage('+(currentpage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalcount+'条记录,共'+totalpage+'页</span>';

                }

                str=str+strend;
                $("#fenyelan").html(str);//分页条初始化

                var array=data.list;
                for(var i=0;i<array.length;i++)
                {
                    var obj=array[i];
                    var id=obj.id;
                    var area=obj.area;
                    var precipitation=obj.precipitation;
                    var month=obj.month;
                    var releasedate=obj.releasedate;
                    //表格的初始化
                    $("#rain_table").append('<tr class="info">\n' +
                        '                <td style="text-align: center">'+id+'</td>\n' +
                        '                <td style="text-align: center">'+area+'</td>\n' +
                        '                <td style="text-align: center">'+precipitation+'</td>\n' +
                        '                <td style="text-align: center">'+month+'</td>\n' +
                        '                <td style="text-align: center">'+releasedate+'</td>\n' +
                        '            </tr>');
                }

            });//页面加载完成之后发送ajax请求end

        });//入口函数end



        //页面按钮的点击回调函数,不需要写在入口函数里面,因为只有页面按钮被点击时,这个函数才会被调用
        function findbypage(curpage,pasize) //被调用的时候,需要传递两个参数:当前页码和页码的大小(一页有几条记录)
        {
            $.post("viewrainbypageservlet",{currentpage:curpage,pagesize:pasize},function (data) //发送ajax请求
            {
                var totalcount=data.totalcount;//总记录数
                var totalpage=data.totalpage;//总页数
                var currentpage=data.currentpage;//当前页码


                if(currentpage==1)//如果当前页码为1,用户还点击上一页的话,设置class="disabled" ,即出现一个“禁用”图标
                {
                    var str=' <li class="disabled" οnclick="findbypage('+(currentpage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }
                else//不为第一页,上一页按钮就是正常的样式
                {
                    var str=' <li οnclick="findbypage('+(currentpage-1)+',5)">\n' +
                        '                    <a href="#" aria-label="previous">\n' +
                        '                        <span aria-hidden="true">&laquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>';

                }


                //分页条中间数字部分
                for(var i=1;i<=totalpage;i++)
                {
                    if(i==currentpage)//如果当前的这个数字等于当前页码currentpage,就设置class="active",即页码呈高亮样式
                    {

                        var item='<li οnclick="findbypage('+i+',5);" class="active"><a href="#">'+i+'</a></li>';
                    }
                    else
                    {
                        var item='<li οnclick="findbypage('+i+',5);"><a href="#">'+i+'</a></li>';
                    }


                    str=str+item;

                }
                if(currentpage==totalpage)//如果当前页码为最后一页,用户还点击下一页的话,设置class="disabled" ,即出现一个“禁用”图标
                {
                    var strend='<li class="disabled" οnclick="findbypage('+(currentpage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalcount+'条记录,共'+totalpage+'页</span>';

                }
                else //不是最后一页,就是正常的样式
                {
                    var strend='<li οnclick="findbypage('+(currentpage+1)+',5)">\n' +
                        '                    <a href="#" aria-label="next">\n' +
                        '                        <span aria-hidden="true">&raquo;</span>\n' +
                        '                    </a>\n' +
                        '                </li>\n' +
                        '                <span style="font-size: 24px" id="total_sp">共'+totalcount+'条记录,共'+totalpage+'页</span>';

                }
                str=str+strend;
                $("#fenyelan").html(str);//改变分页条的内容

                //表格的字符串
                var tablestr='<caption style="text-align: center;font-size: 24px">降雨信息一览</caption>\n' +
                    '            <tr class="success">\n' +
                    '                <th style="text-align: center">id</th>\n' +
                    '                <th style="text-align: center">地区</th>\n' +
                    '                <th style="text-align: center">降雨量(mm)</th>\n' +
                    '                <th style="text-align: center">月份</th>\n' +
                    '                <th style="text-align: center">发布日期</th>\n' +
                    '            </tr>';
                var array=data.list;//具体内容的对象数组
                for(var i=0;i<array.length;i++)//遍历数对象组
                {
                    var obj=array[i];//数组的一个元素就是一个对象
                    var id=obj.id;
                    var area=obj.area;
                    var precipitation=obj.precipitation;
                    var month=obj.month;
                    var releasedate=obj.releasedate;
                    //一行记录的字符串
                    var onerecord='<tr class="info">\n' +
                        '                <td style="text-align: center">'+id+'</td>\n' +
                        '                <td style="text-align: center">'+area+'</td>\n' +
                        '                <td style="text-align: center">'+precipitation+'</td>\n' +
                        '                <td style="text-align: center">'+month+'</td>\n' +
                        '                <td style="text-align: center">'+releasedate+'</td>\n' +
                        '            </tr>';

                    tablestr=tablestr+onerecord;//表格字符串的追加,每遍历一条记录,就会追加一行
                }
                $("#rain_table").html(tablestr);//改变表格里面的内容

            });//ajax请求end

        }//页面按钮的点击函数end

    </script>
</head>
<body>
<div class="container">
    <div class="row">

        <table class="table table-bordered table-hover" id="rain_table">
            <caption style="text-align: center;font-size: 24px">降雨信息一览</caption>
            <tr class="success">
                <th style="text-align: center">id</th>
                <th style="text-align: center">地区</th>
                <th style="text-align: center">降雨量(mm)</th>
                <th style="text-align: center">月份</th>
                <th style="text-align: center">发布日期</th>
            </tr>
        </table>


        <nav aria-label="page navigation">
            <ul class="pagination" id="fenyelan">
                <li>
                    <a href="#" aria-label="previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li><a href="#">1</a></li>
                <li>
                    <a href="#" aria-label="next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size: 24px" id="total_sp">共2条记录,共1页</span>
            </ul>
        </nav>



    </div>

</div>

</body>
</html>

七、效果展示

jquery+Ajax实现简单分页条效果

这只是一个简单的分页条,没有百度分页条“前五后四”的效果。当数据量变得非常庞大时,这个分页条就会占据很大的空间。有时间的话再优化一下吧。至于jquery代码,代码的注释里已经写得够清楚了,这里就不再做过多的解释。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。