Web开发之分页算法,N(N>=3)种解决方案

在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

时间: 2024-08-26 04:12:54

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

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

浅析Web开发中前端路由实现的几种方式 主题 Web开发 故事从名叫Oliver的绿箭虾`说起,这位大虾酷爱社交网站,一天他打开了 Twitter ,从发过的tweets的选项卡一路切到followers选项卡,Oliver发现页面的内容变化了,URL也变化了,但为什么页面没有闪烁刷新呢?于是Oliver打开的网络监控器(没错,Oliver是个程序员),他惊讶地发现在切换选项卡时,只有几个XHR请求发生,但页面的URL却在对应着变化,这让Oliver不得不去思考这一机制的原因- 叙事体故事讲完,

Web开发之分页技术

熟悉Web开发的小伙伴们都知道分页这个玩意儿,但是不会编程的小伙伴们对这个也绝对不陌生,只是不知道这是在Web开发中的一个非常重要的需求和技术罢了. 大家在浏览网上的文章或者图片的时候,经常会看到如下所示的页码显示效果: 这就是所谓的分页技术.为什么要进行分页呢? 很简单内容过多,会使我们的网页过长,我们在浏览网页的时候,不得不一直拖着滚动条或者一直去转鼠标的滚轮,才能看到全部的内容,转一圈.两圈.三圈,你觉得没什么,但是一直这么转下去,相信你会觉得非常的不爽,如此一来,为了获得更好的用户体验,

浅析Web开发中前端路由实现的几种方式

故事从名叫Oliver的绿箭虾`说起,这位大虾酷爱社交网站,一天他打开了 Twitter ,从发过的tweets的选项卡一路切到followers选项卡,Oliver发现页面的内容变化了,URL也变化了,但为什么页面没有闪烁刷新呢?于是Oliver打开的网络监控器(没错,Oliver是个程序员),他惊讶地发现在切换选项卡时,只有几个XHR请求发生,但页面的URL却在对应着变化,这让Oliver不得不去思考这一机制的原因… 叙事体故事讲完,进入正题.首先,我们知道传统而经典的Web开发中,服务器端

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

会话跟踪:主要解决HTTP的无状态问题,即: 当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的.非连续的.当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题.当一个客户在多个页面间切换时,服务器会保存该用户的信息. 1.Cookie: 可以使用 cookie 存储购物会话的 ID:在后续连接中,取出当前的会话 ID,并使用这个 ID 从服务器上的查找表(lookup table)中提取出会话的相关信息. 以这种方式使用 coo

开发、测试调试问题的几种解决方案

在用vue-cli开发vue项目时,需要现在本地服务器上开发.测试,然后当需要调用后端端口的时候,又需要先npm run build打包,将打包后的dist文件夹下的文件再放到Tomcat服务器下,进行测试,这无疑是非常麻烦的,这里记录了我尽可能简化操作的几种方案. 第一种:直接在webpack中设置将文件打包到Tomcat服务器下 通常来说,通过vue-cli构建的项目,会把dist文件打包到根目录下,但是我在测试时还需要再将之copy到Tomcat下,这样很不方便,所以不如就直接打包到Tom

现代Web开发需要学习的15大技术

英文原文:Things to learn for Modern Web Development 现代web开发再一次将发生压倒性的改变.信息资讯的铺天盖地令人迷惑,尤其对于初学者而言.首要原因是新的框架,例如 Angular 2和ReactJs出现了,使用了尚未完全定型的ECMAScript 6特性.并且有更多的工具可用于转换ES6代码为普通的旧的JavaScript代码,也就是ES5. 我概括了一系列我们应该学习的编程语言/工具,以便于理解势不可挡和快速变化的现代web开发. JavaScri

springBoot(9):web开发-CORS支持

一.简介 Web 开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS 等等 1.1.CORS与JSONP相比 1.JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. 2.使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP 有更好的错误处理. 3.JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS浏览器支持情况 Chrome 3+ Firefox 3.5+ Opera

大二女生web开发成长之路——讲述我从软妹子到女汉子的进阶过程

学习和实践前端一年时间,几乎天天在工作室和一群屌丝男程序员一起学习.开发.这种潜移默化的环境下,编码提高了,节操也细碎了. 一年前,娇滴滴的还是工作室里面小师妹一枚,软软的软件工程妹子,做不到人见人爱,但在这个据说男女比例8比1的学校中,仍是比较受欢迎群体——女生中的一员. 然而,    回想过去这一年,跟一帮大老爷们坐在一起讲蛋疼的笑话: 工作室聚餐中满怀“邪”意地企图把师兄们灌醉: 为了赶项目,可以经常和某位苦逼男一起debug到两三点,不亦乐乎: 男生唤我作欣姐,各种玩笑各种开,因为都不拿

Web开发中的18个关键性错误

前几年,我有机会能参与一些有趣的项目,并且独立完成开发.升级.重构以及新功能的开发等工作. 本文总结了一些PHP程序员在Web开发中经常 忽略的关键错误,尤其是在处理中大型的项目上问题更为突出.典型的错误表现在不能很好区分各种开发环境和没有使用缓存和备份等. 下面以PHP为例,但是其核心思想对每一个Web程序员都是适用的. 应用程序级别的错误 1.在开发阶段关闭了错误报告 我唯一想问的是:为什么?为什么在开发的时候要关闭错误报告? PHP有很多级别的错误报告,在开发阶段我们必须将它们全部开启.