看了各位的精彩讨论,感觉受益良多,我现在也准备写一个关于分页的程序,要求和条件如下:
1.要求能够达到系统80%以上的重用,
2.系统架构采用STRUTS(不用TAG)
3.数据访问层用DAO模式和SQL mapping方式(www.ibatis.com),要让其结合在一起
4.因为项目本身是多业务分布模式,所以要有权限认证(不同用户访问不同数据)

看了wait4friend 朋友的程序,和其它的众多资料,感觉离上述要求差别太远,所以想自己动手写一个,各位能不能给出一个整体规划的建议,等写好了,一定奉献给大家

to Ahan,
Looks like you want to build a quite complicated framework, if you are just doing it for learn purpose, go ahead. If you want to apply it to a real project and you have more business cases to worry about, then I will say don't try to reinvent the wheel, there are few off shell solutions.
My "Topas", which scheduled for 1.0Beta in next month, covers everything in your list, those features are months of work for me. Well, I may not be as productive as you are.

Cheers
-Wanchun

不是我非要写,因为系统中大量需要这种分页,有一定的共用性,肯定会大大加快项目进度(维护方便)
只要能够方便和数据访问层有相关接口而非去自己实现DAO和SQL mapping
另外的权限验证也只是说提供接口(如果不能非常灵活的实现,也只能根据系统的特点写死一些部分)
因为项目面临的压力很大
所以不能不作出以上的决定

建议你不要自己写, 现在java世界有很多开源的项目可以利用, 如同jevang所说, 现在缺少的就是这些开源项目之间的整合, 如果能利用已有的资源来达成你的目的, 那不论在速度,项目质量上都要好得多.

wait4friend
看了你的程序很久了,很受启发,尤其是里面设计模式的一些概念,谢谢。不过我对你的ConnectionManager中的线程池的设计有一些不明白。

现在我已经初步实现了这种分页机制
也已经达到了显示端80%以上的重用
使用的东东如下:
<1>struts中的ties实现页面继承
<2>www.ibatis.com中的SQL Mapping 和Dao机制
<3>http://jsptags.com中的分页Pager Tag Library v2.0

现在正在实现数据查询的组件化


tmpID= request.getParameter("id");//id来自上一页面的form提交
然后
strSQL = "select name,age from test where id='"+tmpID+"'";

//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
第一页能正常显示,往下翻时则报错:用尽的result
该怎么解决呢?

其实单纯的分页也简单。
取出整个的resultset,根据页面数和大小算好起始记录的位置,跳到那里开始取所需的记录,取到内存中关闭连接即可。

需要说明的几个问题,
1、resultset是个连接,所以不必担心上百万条的搜索结果会耗尽内存。
2、resultset是个游标,数据库只查询到开始一定数量的记录后,就开始指定起始位置了,所以也不必担心查询速度。(这里有个前提,就是查询的方式应该是只读和游标仅向前的)
3、如果取的起始记录比较靠后,移到该位置时会有内存溢出的问题。这个在oracle中见过。这个问题是oracle驱动的问题,他的做法是每次next或absolute的时候,把所经历过的记录都读到内存中,当然就溢出了。解决办法是换个驱动即可。这在大型项目中的投资可以算不值一提的,而效率会有几十到几百倍的提高。小型项目一般不会有这样的问题,如果有也可通过改进sql语句来达到

你好,请问有没有DAO应用的简单例子?

看了一下, 太多接口了, 日后修改或扩展都不方便.
分页还是用sql做效率最好, 游标遍历大表不是个好主意

我想取得某个对象集的当前分页记录即可。
但如果数据库的记录与当前用户的权限有关呢?这样好象用sql是不行的,还是需要使用游标遍历一条条检查吧?

那这样的效率上会不会有问题?

这东东实在是好,BANQ放在资料栏的两个源代码对我来说都是经典。
可是按照您在AbstractPage里的方法,那返回到页面的不都是STRING数组了吗,这样会不会很浪费资源?而且我照这种方法做(往JSP页面返回数组),一般的简单的页面象论坛的目录列表还能正常显示,可是当显示包含文章,用户名
等的页面时,就只能显示只有一条记录的页面,如果超过一条,就死活显示不了,不知是不是我的方法有问题。

刚上来,咋一看,还以为有什么新的解决ResultSet的方法。

在一看,心里一凉。

仔细一看,完了......
为什么?
因为:楼主不是一个好的老师,且对问题研究不够深入,学了一半就开工。他说的Iterator没什么!关键是对jdbc中基本的东西没搞清楚。有一点我敢肯定,就是一旦真正的connection被关闭,ResultSet就不能用了。
他说的那种情况是因为真正的connection没被关闭,只是被指向了连接池。要是连接池中剩余的连接都被用了,他就会哭了。

在一想,还好!
为什么?
因为:我知道。

关于 分页完美解决之道的实现(原理和代码)见我的书籍《Java实用系统开发指南》的第八章,整个框架是由EJB(数据库)+Struts+Taglib组成。

关于我以前说的connection不关闭,ResultSet是否使用我在另外一个帖子里已经澄清,这是MySQL JDBC的一个BUG。

目前,我的应用已经很少接触到ResultSet,我的关于数据库返回结果的设计只会在上层(设计模式或框架)上解决,也没有兴趣或无法在JDBC层来解决,这不是我的兴趣方向。

我做过的jsp+servlet+BEAN的几个项目,都是把符合条件的都select 出来,然后滚动到最后一行,得到总数,在滚到分页显示开始的行取出每页要显示的记录。感觉还可以,没遇到特别慢的情况啊,大家有什么好方法,指教一下啊,不胜感激。