在Web开发中,分页是最常用的一个功能了。但是,想简单、灵活、方便地解决分页这个问题,还是需要动点脑筋的。

今天,简要梳理下,过去6年中,亲自遇到的分页问题和解决办法。

1. 定义问题

原由:在页面中需要展示若干数据,但不可能一次展示所有的,想通过每次只展示若干条。分页数,pageNo,是为了标记,当前访问的内容在哪里。

后端需要做的:后端需要分页查询数据,把数据返回给前端

前端需要做的:根据后端的数据,构造“1、2、3”等分页面板,并且要响应事件,比如点击“2”,就跳转到第2页

2. 2种思路

解决方法有很多种,我只想根据几个指标,列出几种典型的解决方法。

2.1分页所有相关逻辑,全部由“后端实现”
  
  a. 获取数据库中的数据
   根据totalPage(需要先查询一次数据库)和pageSize,计算总共有多少也totalPage。
  
   然后生成前端js分页,前端直接显示分页js代码${pagejs}。
    
   点击前端分页链接时,后端再根据当前页数pageNo和每页显示的条数pageSize,获取数据。

默认显示第1页。
   
  注:这种全部由后端生成分页的方法,我见过,不过,我不喜欢这种做法。由后端生成前端分页js,感觉太别扭了。

我的观点:前端负责前端的事,后端负责后端的事,尽量不互相影响。

2.2后端只负责数据查询,前端负责构造分页js。
   后端计算count,获取一页数据list。如果用Mybatis,可以写一个拦截器,或者工具方法,自动去查询count。因为count的sql可以根据list的sql来构造,所以能自动化。

前端根据分页完整信息page,构造js。

3.同步or异步
   前端的分页,可以选择“同步刷新“,每次打开新的页面(可能直接覆盖当前页,让人看起来没有重新刷新页面)。
   也可以选择“异步刷新”,发送AJAX请求,替换分页内容。

不同点在于,同步刷新,需要构造“URL”,URL带上了分页信息pageNo,pageSize,也可能需要带上各种查询参数,比如用户名username.
  异步刷新,需要给分页“1”绑定事件响应函数,分页组件需要把这个“回调函数”,提取出来,可以由分页调用者传入。另外一点,分页组件会自动记住查询参数和分页信息。这一点,比同步构造url要简单一些。
  
4.表格型or内容型 
   分页展示的内容可能是表格型,比如“uid uname time money”,一个用户的资金记录,也可能是一页内容,比如一篇文章下方展示10条评论。

表格型的布局展示相对更加“标准化” ,而内容型则变化较大,通常需要自己去构造。
   或者,对表格型的组件进行改进,把“渲染一行内容” 提取成函数,可以让调用者自己传入“渲染方法”,从而达到“复用”的目的。

5.我的实践与选择

a.前端与后端分离,后端查询数据,前端负责展示数据,后端不会生成前端需要的js和html等内容。

b.表格型-异步
    参考秒针前同事写的st-grid,即网上最流行的标准化表格型grid分页组件。
   或者从网上找,比如jquery等各种整套前端框架,都会有这个组件

c.表格型-同步
   前端用JSTL、Freemarker、Struts标签、JSP标签等模版技术,生成分页条,表格内容写个for循环。
   这个地方的分页条,也可以用JS来实现,不过麻烦一点。

同步型的,需要在URL中带上各种分页参数和查询条件,想做成通用的,有一定难度。

d.内容型-异步
    后端都一样,前端写AJAX方法,构造html,再渲染。
    这个是我在写个人官网时,遇到的“新场景”,全部代码,都由我根据其它方式的代码,改造而来。
   显示1篇文章,下方显示若干评论,点击下一页,评论刷新,文章不刷新。

e.内容型-同步 
    与“表格型-同步” 类似,唯一不同的是,for循环生成的不是table,而是div,布局更好看。

6.扯点别的
   代码,我就不贴了,排版很麻烦,而且代码一大堆。这么多种场景,每一种场景的实际代码,都不少。有机会,今后再详细阐述。

通过分页这个事,我再次发现,技术的一个难点就在于,实际的业务或需求有很多种场景,不同场景下的技术实现思路是不同的。想“一次编写,处处使用”非常难。可行的方法是,“一种场景,尽量只编写一次代码,保证这个场景下是万能的就很厉害了”。

写完这篇文章,我猛然发现,可能以前就发现了,在某些领域,我比很多“高级工程师”都要厉害。为什么呢?每个技术工作者在实际工作中遇到的问题是不同的,“术业有专攻”,每个人都在自己的兴趣和工作范围内的事情更为擅长。

今天就扯到这吧,更多关于“技术观点” 的,将放在“雷观”中详细阐述。

总之,我比2年前,刚刚毕业的时候,要强太多了。青春流逝了,我也成长了。

小雷FansUnion-博学的互联网技术工作者
个人官网:http://FansUnion.cn
2014年12月6日

湖北-武汉-循礼门

原文首发:http://fansunion.cn/article/detail/541.html

Web开发之分页算法,N(N>=3)种解决方案的更多相关文章

  1. Java Web开发之分页(ajax)

    1.需要用到的jar包.js文件 JSONArray().fromObject()需要的jar包: (1)commons-beanutils-1.8.3.jar (2)commons-collecti ...

  2. 『实践』Java Web开发之分页(ajax)

    1.需要用到的jar包.js文件 JSONArray().fromObject()需要的jar包: (1)commons-beanutils-1.8.3.jar (2)commons-collecti ...

  3. Java Web开发中用Tomcat部署项目的三种方法

    第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: <Context path="/hello" docBase ...

  4. Java Web开发 之小张老师总结中文乱码解决方案

    中文乱码:在以后学习过程中全部采用UTF-8 1.文件的乱码 1.1.项目文本文件默认编码:        [右击项目]->[Properties]->[Resource]->[Te ...

  5. 《Web开发中让盒子居中的几种方法》

    一.记录下几种盒子居中的方法: 1.0.margin固定宽高居中: 2.0.负margin居中: 3.0.绝对定位居中: 4.0.table-cell居中: 5.0.flex居中: 6.0.trans ...

  6. Web开发中,用到的4种会话跟踪技术

    会话跟踪:主要解决HTTP的无状态问题,即: 当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的.非连续的.当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话 ...

  7. Web开发中 前端路由 实现的几种方式和适用场景

    http://blog.csdn.net/xllily_11/article/details/51820909

  8. web开发-CORS支持

    一.简介 Web 开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS 等等 1.1.CORS与JSONP相比 1.JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求 ...

  9. Python vs Ruby: 谁是最好的 web 开发语言?

    Python 和 Ruby 都是目前用来开发 websites.web-based apps 和 web services 的流行编程语言之一. 这两种语言在许多方面有相似之处.它们都是高级的面向对象 ...

随机推荐

  1. Spider_selenium

    json模块 什么是json? javascript中的对象和数组 对象:{key:value}取值:对象名.key 数组:[...,...]取值:数组[索引值] 作用 json格式的字符串和Pyth ...

  2. JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)

    本文实例总结了JS数组排序技巧.分享给大家供大家参考,具体如下: 1.冒泡排序 var temp = 0; for (var i = 0; i < array.length; i++) { fo ...

  3. 分析器错误消息: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分

    关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案 不知怎么的,每次Win10升级后相应的注册器都恢复默认了,当我运行08版的asp项目时会报这个错. vs上的 ...

  4. java的23中设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  5. Mycat 读写分离+分库分表

    上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试 Mycat就不用多介绍了,可以实现很多分布式数据库的功 ...

  6. 51Nod——N1284 2 3 5 7的倍数

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284 基准时间限制:1 秒 空间限制:131072 KB 分值: 5  ...

  7. 洛谷——P1179 数字统计

    https://www.luogu.org/problem/show?pid=1179 题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 ...

  8. c++中的相对路径

           今天在vs2010里读取相对路径下的图片文件出了点问题.于是查了一下相对路径的编程知识,记录下来分享给大家:      问题描写叙述:path=".\\TrainData\\& ...

  9. spark算子(二)

    1.collect算子 *使用foreachACTION操作 ,collect在远程集群中遍历RDD的元素 *使用collect操作,将分布式在远程集群中的数据拉取到本地 *这种方式不建议使用,如果数 ...

  10. jqgrid 实现行编辑,表单编辑的列联动

    这个问题的场景相信大家都遇到过,比方有A,B,C三列,B,C列均为下拉框.可是C列的值是由B列的值来决定的.即C列中的值是动态变化的,变化的根据就是B列中你选择的值. 本文给出的是一个有用,简易快捷的 ...