J2EE简单的分页器
J2EE项目特别是后台管理,或者一部分前台展示数据比较多,通常需要分页把展示折叠在数据区内.
一般有几种方式来实现分页, 一是官方分页插件,二是自己写,三是网上找(类似于第一种)
这里就介绍第二种, 自写的分页器.
问题就是如果让数据折叠在数据区内, 一种方式是一次取回所有接口数据, 将分页逻辑写在前端, 这种方式相对简单,
且不会刷新页面, 只是考虑到一次数据太多, 会占用很多时间来传数据,生成DOM树,而且数据刷新比较滞后,一般不用.
第二种方式即是当下流行的方式, 将数据分页写在服务端,一次请求一页数据, 每次传页码页数,这样服务器每次返回一
页的数据供前端展示, 小巧灵活. 不便的是每次需要传页码和页数,频繁翻页会增加请求量.
接下来我就来分析一下分页的逻辑.
1. 先看效果

2. 主要功能: 点击页码处,提交请求页. 点击<和>上翻片和下翻片,附加功能是点击某片中最后一页,下翻片, 点击某片中第一页,上翻片.
3. 主要的障碍: 如何记录当前页, 如何分片, 如何共用分页器
主要的逻辑:服务器和客户端都需要增加逻辑, 服务器为数据列表型接口增加两个参数,page和pageSize, 指示当前页和页大小.
利用Hibernate中的listByPage来分页. 返回特定页的数据,注意数据是从第1页开始的.再将当前页和页大小传回到客户端.
客户端主要是提供一个表单来上传page和pageSize,通过点击页码来提交表单.获取Total后根据当前面和页大小生成当前片上的页码.
需要标记出当前分页器<和>的DOM位置,生成页码.
JS主要逻辑:
var allPageArray = new Array();
var pageArray = new Array();
var currentSlice = 1;// 当前片码
var currentPage = $('#pageHolder')[0].value;// 当前页码
var count = $('#countHolder')[0].value; // 总记录数
var initPageNum = 10; // 每片页码数量
var totalPage = Math.ceil(count / initPageNum);// 总页数
var pageUl = $('.pagination>ul')[0]; // 页码父结点
var pageNextPlace = $('li.next')[0]; // 下一片码对象
var pagePrevPlace = $('li.previous')[0]; // 上一片码对象
var lastPageTips = $('.lastPageTips')[0]; //最后一页提示DOM
clearPage(); //清空页码
initAllPageArray();//初始化 function initAllPageArray() {
for (var i = 0; i < totalPage; i++) { // 填充totalPage内容
allPageArray[i] = i;
}
if (totalPage >= initPageNum) { // 如果大于10页,装载当前面所在页片上的页码
if (currentPage == totalPage) { // 如果已经到达最后一页
pageArray = allPageArray.slice(currentPage - initPageNum,
currentPage);
tipLastPage();
} else {
pageArray = allPageArray.slice(currentPage - currentPage
% initPageNum, currentPage - currentPage % initPageNum
+ initPageNum > totalPage ? totalPage : currentPage
- currentPage % initPageNum + initPageNum);
}
} else {
pageArray = allPageArray;// 如果少于10页,全部展示
if (currentPage == totalPage) {
if (totalPage != 1) {
tipLastPage();
}
}
}
loadPage(pageArray); // 装载页码
$('.pagination-style>ul>li>a').each(function() { // 激活当前页码样式
if (this.innerHTML == currentPage) {
this.parentNode.className = "active";
}
});
} // 取上/下翻页码数组
function getPageArray(pageArray, direct) {
if (allPageArray.length != 0 && pageArray.length != allPageArray.length) { // 如果长度不相等则说明长度够几片
if (direct == 0) {// 前翻
if (pageArray[pageArray.length - 1] >= initPageNum) { // 从11页以后往前翻,前进10页
if (pageArray[0] >= initPageNum) {// 首页大于10页,则取前10页
pageArray = allPageArray.slice(pageArray[0] - initPageNum,
pageArray[0]);
} else {// 首页小于10,取上一页可能不满10页,则显示0-9页
pageArray = allPageArray.slice(0, initPageNum);
}
} else {// 从1-10页往前翻.装1-10
// 页码不需要加载
}
} else if (direct == 1) {// 后翻
if (pageArray.length < 10
|| (pageArray.length == 10 && pageArray[pageArray.length - 1] == allPageArray.length - 1)) {// 最后一片没装满或者最后一页装的是最后一片
// 不需要处理
pageArray = pageArray;
tipLastPage();
} else {
if (allPageArray.length >= (pageArray[pageArray.length - 1] + 10)) {// 最后还有一片可以装满
pageArray = allPageArray.slice(
pageArray[pageArray.length - 1] + 1,
pageArray[pageArray.length - 1] + 1 + initPageNum);
} else {// 最后一片,装不满
pageArray = allPageArray.slice(
pageArray[pageArray.length - 1] + 1,
allPageArray.length);
}
} }
} else {// 如果长度不够10,说明一片都没存满
pageArray = allPageArray;
}
return pageArray;
}
// 加载页码DOM
function loadPage(array) {// 加载一片页码
var pageUl = $('.pagination>ul')[0];
var pageNextPlace = $('li.next')[0];
var num = initPageNum;
for (var i = 0; i < array.length; i++) {
var pageNode = pageNextPlace.cloneNode(true);//克隆的是>下翻的DOM
pageNode.className = "";//清空className, classList不适配所有的浏览器
var aLink = pageNode.querySelector("a");
aLink.innerHTML = array[i] + 1;//写上页码
aLink.className = "";
pageUl.insertBefore(pageNode, pageNextPlace);
}
initPageNodeClick();
}
// 提交search form表单
$('input')[2].onblur = function() {
$("[name='page']")[0].value = "1";
$('#searchForm')[0].submit();
}
//
$('input')[2].onfocus = function() {
$("[name='page']")[0].value = "1";
} // 初始化页片上页码的点击响应功能
function initPageNodeClick() {
$('.pagination-style>ul>li>a')
.each(
function() {
this.onclick = function() {
if (this.className == "fui-arrow-left") {
if (totalPage <= 10) {
if (undefined == $('.pagination-style>ul>li>a')[1].click) { dispatch(
$('.pagination-style>ul>li>a')[1],
"click"); // safari
} else {
$('.pagination-style>ul>li>a')[1]
.click();
}
;
} else {
pagePrevClick();
}
} else if (this.className == "fui-arrow-right") {
if (totalPage <= 10) {
if (undefined == pageUl
.querySelectorAll('li')[totalPage]
.querySelector('a').click) { dispatch(
pageUl.querySelectorAll('li')[totalPage]
.querySelector('a'),
"click"); // safari
} else {
pageUl.querySelectorAll('li')[totalPage]
.querySelector('a').click();
}
} else {
pageNextClick();
}
} else {
$("[name='page']")[0].value = this.innerHTML;
$('#searchForm')[0].submit();
} };
})
}
// 清空页码DOM
function clearPage() {
var liArray = $('.pagination-style>ul>li');
for (var i = 0; i < liArray.length; i++) {
var li = liArray[i];
if (li.className != 'previous' && li.className != 'next') {
pageUl.removeChild(li);
}
}
} // 上翻页片功能
function pagePrevClick() {
clearPage();
pageArray = getPageArray(pageArray, 0);
loadPage(pageArray);
}
// 下翻页片功能
function pageNextClick() {
var temp = getPageArray(pageArray, 1);
if (pageArray != temp) {
pageArray = temp;
clearPage();
loadPage(pageArray);
}
}
function tipLastPage() {
$(lastPageTips).css("visibility", "visible");
clearTips();
} function clearTips() {
setTimeout(function() {
$(lastPageTips).css("visibility", "hidden");
}, 1500);
}
//为了适配Safari,点击a标签不会触发onclick事件.
function dispatch(el, type) {
try {
var evt = document.createEvent('Event');
evt.initEvent(type, true, true);
el.dispatchEvent(evt);
} catch (e) {
alert(e);
}
}
J2EE简单的分页器的更多相关文章
- Bootstrap页面布局18 - BS导航路径以及分页器
导航路径:又叫“面包屑”,功能是让用户知道所处的位置. <!--面包屑--> <ul class='breadcrumb'> <li><a href='#'& ...
- drf框架之分页器的用法
1. 分页器分为:简单分页器与偏移分页器和加密分页器 2.实现一个简单的分页器的用法: # 简单分页 # 第一步,导入分页类 # from rest_framework.pagination impo ...
- Django组件之分页器
分页器 简单的分页器实现 views.py from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger from ap ...
- vue实现分页器(仿element)
1.起因 今日看完element中分页器的源码实现,比较简单,遂自己按着理解实现了一个简单的分页器,记录下来,以便日后温习. 2.实现难点 分页器的实现难点主要是什么时候显示分页器的省略, 我的思路是 ...
- angular实现简单的pagination分页组件
不想使用第三方库,只想使用一个分页器,那么就简单的实现一个,效果如下: 1.使用方式: <custom-pagination *ngIf="enterpriseList.length& ...
- ASP.NET MVC 数据分页思想及解决方案代码
作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MV ...
- play framework2.5.
play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...
- java分页之假分页
假分页,顾名思义,不是真正的在数据库里进行过滤,而是从数据库查询之后,取得全部结果,在展现的时候做些手脚. import java.util.ArrayList; import java.util.L ...
- Django杂篇(1)
目录 Django杂篇(1) bulk_create Pagination 创建多对多表关系的常用方法 form校验组件的应用 渲染页面 展示错误信息 校验数据 常用字段 Django杂篇(1) 这里 ...
随机推荐
- 一个web前端开发者的日常唠叨
时间飞逝,距离上一次更新博客已经过去了三个月,上一篇博客的发布时间停留在了4月4日. 近来三个月没有更新博客,深感抱歉和愧疚.停更博客就意味着学习的越来越少,作为一个普通的前端开发者来说这是万万不可取 ...
- 学习Canvas这一篇文章就够了
一.canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...
- [SCOI2007]压缩(动态规划,区间dp,字符串哈希)
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
- Selenium+java - PageFactory设计模式
前言 上一小节我们已经学习了Page Object设计模式,优势很明显,能更好的体现java的面向对象思想和封装特性.但同时也存在一些不足之处,那就是随着这种模式使用,随着元素定位获取,元素定位与页面 ...
- 目标检测YOLO进化史之yolov1
yolov3在目标检测领域可以算得上是state-of-art级别的了,在实时性和准确性上都有很好的保证.yolo也不是一开始就达到了这么好的效果,本身也是经历了不断地演进的. yolov1 测试图片 ...
- There’s More Than One Way To Do It!
There’s More Than One Way To Do It!
- 逆向破解之160个CrackMe —— 017
CrackMe —— 017 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 0807 创建vue实例以及vue的基础指令
lession1 1.Vue的了解 渐进式框架 作者:尤雨溪 mvvm 2.创建vue实例 引入<script src="vue.js"><scr ...
- ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证
本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...
- .net core 单元测试之 JustMock第一篇
前面介绍了单元测试的框架NUnit,它可以很好的帮助我们建立测试,检验我们的代码是否正确.但这还不够,有时候我们的业务比较重,会依赖其它的类.基于隔离测试的原则,我们不希望依赖的其它类影响到我们的测试 ...