无线&移动互联网技术研发
换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
分页(老式分页--wap项目的启迪)
Posted on 2009-05-21 22:05
Gavin.lee
阅读(438)
评论(0)
编辑
收藏
所属分类:
web 积累(前端 + 后台)
分页技术在web开发中是不可忽略的,也是非常重要的。其实传统分页跟新式分页还是各分千秋的,不能说老的不好,新的就好,要具体对待具体的项目。从网上看到某人的一段话,非常有效,相信这位仁兄也是经验之谈了:
“第一种方法是用select语句查询出所有的数据,再通过移动当前记录指针到当前页面需要显示的数据记录位置,再作显示。优点是程序比较简单,由于查询出来的结果较大,网络开销也较大。
第二种方法是先用一条select语句得到SQL查询的记录条数,因为数据库存执行"select count(*)"运算的速度是很快的,返回的数据集也仅一条记录,此开销可忽略不记。得到总记录数后,再计算出当前页面要显示的数据的SQL查询结果的起始位置和结束位置,再用SQL语句查询出当前页的数据。这种方法编写的程序的量相对较多,得到的数据量也相对较小,运行效率比第一种高,但并不能从根本上优化数据库的SQL查询,也不能从根本上解决网络开销大的问题。
第三种方法是使用存储过程。存储过程在数据库中会作预编译处理,所以执行速度较快。在JSP页面中要设定每页记录条数、当前的页码等参数,再将这些参数在调用存储过程时传入到存储过程中,由存储过程执行后得到指定页指定数目的记录数。这种方法优点烛效率最高,网络开销小,缺点不是程序员需要编写较多的程序,针对每个查询要编写不同的存储过程。”
三种分页我也都有用到过,我的一点感受:第一,三种方案对java程序设计师非常简单的。首先推翻一种说法,网上很多网友都说什么缓存数据查询结果集。乍一想很不过的想法。仔细一想,怎么可能。每当在数据库连接关闭时(PareparedStatement,Connection关闭),ResultSet 也都关闭了。看看下面的图就知道了:
分页一:
我是这样做的,首先我得到结果集(在我的项目里,结果集是解析xml而来的),然后都放到list中,传到view层(JSP),将这个list保存在HeepSession中。每次查询分页都是在这个list里截取。在数据量很小的情况下,这个还是非常方便的。只需要读取一次xml(一般连接DB的时候也只要连接一次)。同时缺点也是非常明显的:1.当这个结果集很大的时候无疑是非常耗内存的,效率也大减;2.实时性也很差,开始就将数据封装在list里了,得不到即时更新。
我在wap项目中的具体实现,wap用法很简单:
注:为了方便我个人,有些无用信息我也不删除了,如果有读者看到,无用信息就忽略了吧。还有这里的list是我从后层解析xml封装的Listprize 集合。
JSP:
<%
request.setCharacterEncoding(
"
UTF-8
"
);
String lotid
=
request.getParameter(
"
lotid
"
);
String name
=
request.getParameter(
"
name
"
);
String pages
=
request.getParameter(
"
pages
"
);
int
pageI
=
Integer.parseInt(pages);
String cpname
=
""
;
if
(lotid.equals(
"
7
"
))
{
cpname
=
"
福彩3D
"
;
}
else
if
(lotid.equals(
"
28
"
))
{
cpname
=
"
大乐透
"
;
}
else
if
(lotid.equals(
"
8
"
))
{
cpname
=
"
22选5
"
;
}
else
if
(lotid.equals(
"
20
"
))
{
cpname
=
"
29选7
"
;
}
else
if
(lotid.equals(
"
5
"
))
{
cpname
=
"
数字排列
"
;
}
else
if
(lotid.equals(
"
11
"
))
{
cpname
=
"
七乐彩
"
;
}
else
if
(lotid.equals(
"
4
"
))
{
cpname
=
"
七星彩
"
;
}
else
if
(lotid.equals(
"
26
"
))
{
cpname
=
"
36选7
"
;
}
else
if
(lotid.equals(
"
12
"
))
{
cpname
=
"
时时乐
"
;
}
else
if
(lotid.equals(
"
3
"
))
{
cpname
=
"
双色球
"
;
}
else
if
(lotid.equals(
"
21
"
))
{
cpname
=
"
15选5
"
;
}
else
if
(lotid.equals(
"
1
"
))
{
cpname
=
"
胜负彩
"
;
}
else
if
(lotid.equals(
"
15
"
))
{
cpname
=
"
半全场
"
;
}
else
if
(lotid.equals(
"
17
"
))
{
cpname
=
"
进球彩
"
;
}
else
if
(lotid.equals(
"
29
"
))
{
cpname
=
"
时时彩
"
;
}
out.write(cpname
+
"
最新一期用户中奖信息<br/>
"
);
//
第一次访问排行榜的时候,初始化排行榜list,并將其放入session,供下次分頁。
if
(pageI
==
1
)
{
List
<
Listprize
>
list
=
prize.getPrize(lotid, name);
session.setAttribute(
"
list
"
, list);
}
List
<
Listprize
>
listPrize
=
(List
<
Listprize
>
)session.getAttribute(
"
list
"
);
int
allpage
=
listPrize.size()
/
10
+
(listPrize.size()
%
10
==
0
?
0
:
1
);
int
allRec
=
listPrize.size();
int
pagesize
=
10
;
out.write(
"
共
"
+
allRec
+
"
位中奖,第
"
+
pageI
+
"
/
"
+
allpage
+
"
页<br/>
"
);
if
(allRec
<=
pagesize)
{
for
(Listprize l: listPrize)
{
out.write(
"
[
"
+
cpname
+
"
]
"
+
l.getUsername()
+
"
喜中
"
+
l.getGetMoney()
+
"
<br/>
"
);
}
}
else
{
if
(pageI
==
allpage)
{
for
(
int
i
=
(pageI
-
1
)
*
pagesize; i
<
allRec; i
++
)
{
Listprize prizeObject
=
listPrize.get(i);
out.write(
"
[
"
+
cpname
+
"
]
"
+
prizeObject.getUsername()
+
"
喜中
"
+
prizeObject.getGetMoney()
+
"
<br/>
"
);
}
out.write(
"
<anchor><go href='newaward.jsp'>上一页<postfield name='lotid' value='
"
+
lotid
+
"
'/><postfield name='name' value='
"
+
name
+
"
'/><postfield name='pages' value='
"
+
(pageI
-
1
)
+
"
'/></go></anchor><br/>
"
);
}
else
{
for
(
int
i
=
(pageI
-
1
)
*
pagesize; i
<
pageI
*
pagesize; i
++
)
{
Listprize prizeObject
=
listPrize.get(i);
out.write(
"
[
"
+
cpname
+
"
]
"
+
prizeObject.getUsername()
+
"
喜中
"
+
prizeObject.getGetMoney()
+
"
<br/>
"
);
}
if
(pageI
>
1
)
{
out.write(
"
<anchor><go href='newaward.jsp'>上一页<postfield name='lotid' value='
"
+
lotid
+
"
'/><postfield name='name' value='
"
+
name
+
"
'/><postfield name='pages' value='
"
+
(pageI
-
1
)
+
"
'/></go></anchor>
"
);
}
out.write(
"
<anchor><go href='newaward.jsp'>下一页<postfield name='lotid' value='
"
+
lotid
+
"
'/><postfield name='name' value='
"
+
name
+
"
'/><postfield name='pages' value='
"
+
(pageI
+
1
)
+
"
'/></go></anchor><br/>
"
);
}
}
%>
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
org.hibernate.hql.antlr.HqlBaseParser.recover(NoSuchMethodError)
使用Appfuse快速构建J2EE应用
大型门户网站的十四大技术!!!
Urlrewrite与Struts2.x结合使用
HttpWatch的检测指示说明:Blocked、Connect、Send、Wait、Receive
SOA (Service-Oriented Architecture)的服务接口设计最佳实践
HTTP && HTTPS
优良、高效的web service 接口
TCP/IP 基础介绍
access.log日志分析 --PV等
Powered by:
BlogJava
Copyright © Gavin.lee
日历
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的文章
我的评论
我的参与
最新评论
留言簿
(13)
给我留言
查看公开留言
查看私人留言
我参与的团队
深圳Java俱乐部(0/0)
随笔档案
(19)
2011年6月 (1)
2011年5月 (1)
2010年12月 (1)
2010年5月 (1)
2010年1月 (1)
2009年8月 (2)
2009年6月 (6)
2009年5月 (6)
文章分类
(277)
Date tools(4)
FreeMarker (7)
java design pattern(3)
java SE & EE(60)
JDBC(14)
jsp 【勿忘】(5)
Linux command(7)
Linux shell 入门(11)
Linux 日常应用(5)
Log && File Operate(8)
MemCache (5)
SiteMesh 页面装饰组件(2)
SSH2 --Hibernate(6)
SSH2 --Spring(9)
SSH2 --Struts2(21)
Subversion(Svn)(5)
wap 积累(8)
web 积累(前端 + 后台)(33)
xml doc 操作(12)
多线程(6)
性能分析(7)
类的设计(4)
经典语录(3)
经验&常识(32)
文章档案
(282)
2011年7月 (1)
2011年6月 (1)
2011年5月 (1)
2011年4月 (1)
2011年3月 (1)
2011年2月 (1)
2010年12月 (6)
2010年11月 (8)
2010年10月 (1)
2010年9月 (6)
2010年6月 (7)
2010年5月 (22)
2010年4月 (1)
2010年3月 (14)
2010年2月 (2)
2010年1月 (10)
2009年12月 (32)
2009年11月 (30)
2009年10月 (2)
2009年9月 (5)
2009年8月 (13)
2009年7月 (41)
2009年6月 (43)
2009年5月 (33)
收藏夹
(7)
java 基础类(1)
JSP(1)
server(2)
WEB(1)
数据库
设计模式(2)
友情链接
blogjava中的强人
chinaunix 社区
java 世纪网
java 基础辅导文章
javaeye 蓝色的风
SQL语句教程
与java共舞
中国协议分析网
中文java技术网
多线程
待看的文章
感兴趣的 csdn
我的漫漫程序之旅
新起点,新开始
梦幻之旅
赵学庆 的博客
超级多文章的牛人
隔叶黄莺 The Blog of Unmi
高手论坛
最新随笔
1. Mysql:1292 truncated incorrect double value -- concat 函数用法
2. Mysql 插入当前时间【摘】
3. 学计算机的你伤不起啊【雷人】
4. ucweb和opera工作原理的差别【摘】
5. 清朝皇帝列表
6. 设置IE查看源文件时默认打开的编辑器【转】
7. subclipse svn修改用户名密码问题【摘】
8. hibernate.dialect (Hibernate SQL方言)-备用
9. Tomcat JspFactory的异常的原因及解决办法
10. 关于MyEclipse中的Tomcat启动的问题 【Tomcat JDK name error】
11. win-xp 自动关机脚本 【古老的记忆】
12. Office 2007 Word 打开故障 - "The setup controller has encountered a problem during instll"
13. 木匠家的门
14. MyEclipse 后台进程一直运行"computing additional info"的解决办法
15. MyEclipse 一直 initializing java tooling······
16. MyEclipse 代码提示(“@”自动提示)
17. org.hibernate.hql.ast.QuerySyntaxException(我的流水账)
18. org.hibernate.hql.antlr.HqlBaseParser.recover(NoSuchMethodError)
19. SVN:cannot map the project with svn provider解决办法
20. WAP1.0 前端开发经验(原创-JSP)
21. Notepad++提示"Load langs.xml failed!"的解决方法
22. 让你的PC也能访问手机腾讯网
23. 【转】Proxool 连接池的配置-hibernate篇
24. Hibernate 主键生成策略
25. Quartz cron 表达式格式的含义
26. OGNL功用!!!
27. 使用Appfuse快速构建J2EE应用
28. 大型门户网站的十四大技术!!!
29. Urlrewrite与Struts2.x结合使用
30. HttpWatch的检测指示说明:Blocked、Connect、Send、Wait、Receive
31. 解读JAR,SIS,SISX格式区别!!!
32. commons-lang-2.4.jar 包常用方法集锦
33. Struts2中解决一个表单多种提交
34. JSTL(Java Standard Tag Library) 标记库的使用
35. Struts2验证错误信息的两个经典方法-addFieldError&addActionError
36. Hibernate常见异常-无法转换为内部表示
37. Spring AOP详细导读-用多手段实例对比呈现AOP
38. Struts2 Result-type(封装Action层到View层的跳转逻辑)
39. 在Struts2中以IOC和非IOC方式获取session&request
40. 采用url链接形式提交action(非s:from方式提交)
搜索
积分与排名
积分 - 353909
排名 - 156
最新评论
1. re: Struts2验证错误信息的两个经典方法-addFieldError&addActionError
S2C4
--asdad
2. re: Struts2验证错误信息的两个经典方法-addFieldError&addActionError[未登录]
asd
--as
3. 21232.2323
323432432
--冯海波
4. re: SVN:cannot map the project with svn provider解决办法[未登录]
多谢!已经解决。
--will
5. re: Struts2验证错误信息的两个经典方法-addFieldError&addActionError
44
--2
阅读排行榜
1. 学计算机的你伤不起啊【雷人】(1011)
2. 看看这个笑话,你就知道干IT的不容易了!!(620)
3. 清朝皇帝列表(609)
4. 每天读一遍,不久你就会变! ---- 很好很强大(466)
5. 木匠家的门(416)
评论排行榜
1. 学计算机的你伤不起啊【雷人】(0)
2. 清朝皇帝列表(0)
3. 木匠家的门(0)
4. 每天读一遍,不久你就会变! ---- 很好很强大(0)
5. 我喜欢的语录(0)