jquery+Ajax实现简单分页条效果
本文实例为大家分享了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">«</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">«</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">»</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">»</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">«</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">«</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">»</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">»</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">«</span> </a> </li> <li><a href="#">1</a></li> <li> <a href="#" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> <span style="font-size: 24px" id="total_sp">共2条记录,共1页</span> </ul> </nav> </div> </div> </body> </html>
七、效果展示
这只是一个简单的分页条,没有百度分页条“前五后四”的效果。当数据量变得非常庞大时,这个分页条就会占据很大的空间。有时间的话再优化一下吧。至于Jquery代码,代码的注释里已经写得够清楚了,这里就不再做过多的解释。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要介绍了jquery实现加载更多"转圈圈"效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10
- 最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了。写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性...2015-10-30
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文实例讲述了jQuery实现非常实用漂亮的select下拉菜单选择效果。分享给大家供大家参考,具体如下:先来看如下运行效果截图:在线演示地址如下:http://demo.jb51.net/js/2015/js-select-chose-style-menu-codes/具体代码如...2015-11-08
- 本文实例讲述了jquery实现的伪分页效果代码。分享给大家供大家参考,具体如下:这里介绍的jquery伪分页效果,在火狐下表现完美,IE全系列下有些问题,引入了jQuery1.7.2插件,代码里有丰富的注释,相信对学习jQuery有不小的帮助,期...2015-10-30
- JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
- 拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过,不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍我也不会照本宣科的翻译...2014-05-31
- 当页面打开时我们需要执行一些操作,这个时候如果我们选择使用jquery的话,需要重写他的3中方法,自我感觉没什么区 别,看个人喜好了,第二种感觉比较简单明了: 第一种: 复制代码 代码如下: <script type="text/javas...2014-06-07
jquery中常用的SET和GET$(”#msg”).html循环介绍
复制代码 代码如下: $(”#msg”).html(); //返回id为msg的元素节点的html内容。 $(”#msg”).html(”new content“); //将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content $(”...2013-10-13- jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
jQuery Mobile开发中日期插件Mobiscroll使用说明
这篇文章主要介绍了jQuery Mobile开发中日期插件Mobiscroll使用说明,需要的朋友可以参考下...2016-03-03- 直接为大家介绍制作过程,希望大家可以喜欢。HTML结构该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进...2015-10-30
jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31- 这篇文章主要为大家详细介绍了jQuery实现广告显示和隐藏动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-05
- 本文实例讲述了jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果。分享给大家供大家参考,具体如下:这里演示jQuery实现鼠标移动到链接上,滑动展开/隐藏图片效果,鼠标放在“上一页”“下一页”上,立即浮现出所对应的图...2015-10-30
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
这篇文章将使用jQuery,并结合PHP,将Fckeditor发布的内容进行分页,并且实现无刷新切换页面。 本文假设你是WEB开发人员,掌握了jQuery和PHP相关知识,并且熟知Fckeditor的配置和使用。...2015-10-23- jQuery实现带玻璃流光质感的手风琴特效是一款基于jQuery+CSS3实现的带玻璃流光质感的手风琴特效,分享给大家,具体如下效果图:具体代码如下:html代码: <section class="strips"> <article class="strips__strip"> <di...2015-11-24
- 有时候我们为了省事就操作键盘组合键去代替使用鼠标,我们今天就使用JQuery实现Ctrl+Enter提交表单。我们发帖时,在内容输入框中输入完内容后,可以点击“提交”按钮来发表内容。可是,如果你够“懒”,你可以不用动鼠标,只需按...2015-10-23
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自...2015-10-30