免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2734 | 回复: 9
打印 上一主题 下一主题

大家来说说用karrigell开发WEB程序的分页思路. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-26 22:34 |只看该作者 |倒序浏览
不可能在一个页面中显示太多数据,不合理,也难看,所以采用分页方式.
我正在做这个东东,请大家提供一点好的思路.

论坛徽章:
0
2 [报告]
发表于 2006-05-27 10:10 |只看该作者
原帖由 sunny3super 于 2006-5-26 22:34 发表
不可能在一个页面中显示太多数据,不合理,也难看,所以采用分页方式.
我正在做这个东东,请大家提供一点好的思路.

客户端页面显示两类数据,页数、当前页包含的记录。这两个数据结构设计好了,这个功能处理就比较清楚。
一般而言,服务器端根据条件搜索出所有记录,根据分页参数(多少条记录/页)计算出页数,客户端发送请求调阅对应记录。具体实现方式参照具体应用来设计。

论坛徽章:
0
3 [报告]
发表于 2006-05-27 12:03 |只看该作者
楼上说的没有错,不过我的思路还不成熟, 举例代码如下:我用MSSQLSERVER2000的.
...
...
<%
Man_Cur=conn.cursor()
Man_sql='select * from Fabric where Add_person='+ "'"+so.login+"'" +'order by CreationDate desc'
Man_Cur.execute(Man_sql)
%>
到这里为止,已经取出了记录.
maxnum=Man_Cur.rowcount  得到总记录数
pagenum=20 设置每一页显示20条记录

由上面两个东东可以得到总页数,比如为 maxpage
当前页用 curpage 表示

浏览商品的页面为 search.pih 或者为 search.hip
如何用 如下方式分页显示 search.pih?page=2

关于分页函数的思路怎么继续下去呢.

如果在ASP里面ADO会提供一个记录数,所以翻到上一页,下一页
好像能记录绝对地址一样.

郁闷中????
继续想办法解决问题.

论坛徽章:
0
4 [报告]
发表于 2006-05-27 15:23 |只看该作者
一般的数据库的select语句都应该支持limit和offset吧?
楼上的怎么又来asp了?真是搞不明白

论坛徽章:
0
5 [报告]
发表于 2006-05-27 20:06 |只看该作者
原帖由 sunny3super 于 2006-5-27 12:03 发表
楼上说的没有错,不过我的思路还不成熟, 举例代码如下:我用MSSQLSERVER2000的.
...
...
<%
Man_Cur=conn.cursor()
Man_sql='select * from Fabric where Add_person='+ "'"+so.login+"'&qu ...

如你所述:
客户端request-》search.pih?page=2
服务器端reponse-》对应页面数据记录集,这个数据集是写页面返回还是用ajax方式只返回一个数据包(JSON或XML)看你的设计。
推荐你用ajax方式实现,客户端可采用mochikit库,服务器端使用karrigell的ks脚本实现,ks脚本的作用就是一个任务分发引擎,可以再写一个专门数据读取并做分页处理的类,ks脚本调用这个类返回数据记录集和分页索引。
归纳起来就是:
客户端ajax组件-》搜索请求-》服务器端ks脚本-》响应请求,调相关类-》返回数据集(页面总数,当前页,当前页面包含的记录集)-》客户端接收数据集,展现数据。
调试时,建议分层次实现,例如:先做一个包括多行数据记录的文件,接着做一个对这个数据文件进行处理的类(先写接口,数据写入、数据读出、数据更改等等),再用ks脚本调用这个类并返回给客户端页面文件,最后完成客户端页面组件(ajax)和数据库对接。
总的指导原则是先构建数据对象,接着实现对数据对象处理的组件,最后将这个组件与应用处理流程联调。

[ 本帖最后由 broader 于 2006-5-27 20:13 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-05-29 13:21 |只看该作者
有点高深,还不是很了解.我继续想办法.
谢谢大家.

论坛徽章:
0
7 [报告]
发表于 2006-05-30 09:45 |只看该作者
其实分页正如前面所述,就是通过offset来设定起始的位置,limit用来设置取多少条记录。这样就起到了分页的效果。通过设置上一下,下一页来设定上页和下面的起始位置即可。

有直接通过页号,有通过起始记录数,意思是一样的。

如果你使用django的话,它自带一个分页处理的类,会更方便。

论坛徽章:
0
8 [报告]
发表于 2006-05-30 20:53 |只看该作者
多谢limodou  兄弟,我采用你说的后一种方法,我在表上建立了一个自增量字段,如果每一页显示20条的话,
就select top 20 * from table1 where id条件 order by id desc,上一页,下一页就在于ID条件的设定,

不过我第一次打开的时候我没有ID限制的,直接TOP 20 * 的.

谢谢大家.

论坛徽章:
0
9 [报告]
发表于 2006-05-30 21:00 |只看该作者
另外可以用offset,不过我觉得很慢,效率不高,
比我 我打开了一个表 select * from table1 where id>1
total=cur.rowcount
if total % 20>1:
   totalpage=total/20 + 1 #每一页显示20条记录.
else:
   totalpage=total/20  #totalpage是总页数.
如果用offset 的方式 每翻一页就要打开一次这个表,(我感觉很浪费,很多数据是多余的,效率不高),然后用offset定位,然后 fetchmany(20)得到该页的数据,如果在数据量大的情况下,效率不高呀.
比如:我要显示第8页的记录.
cur.offset(20*7)
cur.fetchmany(20) #得到第八页的数据.然后显示出来,
数据量大就浪费了,效率低,好象游标一样.

不知道我分析是否有道理,或者有更好的办法,请大家指点.

所以我采用了用ID来定位的方法,每次取20条很快的.

论坛徽章:
0
10 [报告]
发表于 2006-05-31 01:00 |只看该作者
我理解有错误。
offset limit用于select 语句中,cur.offset(20)是错误的,纠正。
select * from table1 limit 140,20

[ 本帖最后由 sunny3super 于 2006-5-31 01:04 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP