项目中使用到了ecside,不过没有使用到分页技术,每次都是吧数据库所有的记录给查出来,放到request对象中,然后ecside展示,前台的ecside拿到了request对象中的数据list,根据页面上用户选择的每页显示巨鹿数目,计算出一共多少页,比如记录有10页,当前是第一页,你点第二页,ecside也是在去查一下数据库,把所有的记录找出来,根据每页显示的记录数目,计算出第二页显示的数据记录的起止位置,然后在页面上显示,当数据量巨大的时候,不使用分页就会出现OOM的问题,以下是ecside基于数据库分页的一个简单实现,每次按需取数据,不管记录再多,也不会OOM
准备工作:
1. ecsise 2.0 相关jar包+Mysql 数据库环境+struts
2.在mysql 中建立一个表
CREATE TABLE `user` ( `name` varchar(20) NOT NULL, `age` varchar(20) NOT NULL, `sex` char(30) DEFAULT NULL, `pw` char(30) DEFAULT NULL, `time` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk
目标:user表中有11条数据,使用数据库层分页技术,每次都按需取数据
分析:ecside展示数据的时候需要吧记录的list放到request中,讲记录的总数也放到request对象中,因此,我们只需要在页面上得到,当前的页码,用户选择的页面上记录显示的数目,在数据库层使用mysql的 limit 就可以构造出分页sql了
解决方案:(关键步骤)
a.使用 RequestUtil.getPageNo(request) 得到当前的页码
b.使用 RequestUtil.getCurrentRowsDisplayed(request) 得到 页面上显示的记录的数目
MYSql 的limit的用法:
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。 mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。
c. 使用 select * from user order by time desc limit 2,4 使用类似的sql得到分页记录,如果是oracle可以使用一个子查询,并使用rownum
d. 构造结果对象 ResultObject
package cn.com.xinli.bean; import java.io.Serializable; import java.util.ArrayList; public class ResultObject implements Serializable { /** * 分页查询结果集对象 * count 不分页查询所有的结果集的数目(从数据库select count(1) from user) * list 页面上需要显示的分页后的记录list */ int count; ArrayList list=new ArrayList (); public int getCount() { return count; } public void setCount(int count) { this.count = count; } public ArrayList getList() { return list; } public void setList(ArrayList list) { this.list = list; } }
e.告诉ecside 总的记录数目,和需要展示的 数据的list
request.setAttribute("totalRows",ro.getCount());
request.setAttribute("recordList",ro.getList());
f. 在页面上 ectable 中使用 retrieveRowsCallback="limit" 代表分页机制是 数据库层分页
完整的实现见附件,你只需要
1.修改 conf.properties 中的数据库连接参数
2.建立一个user表
3.部署在tomcat中,访问 http://localhost:9090/ecside/test.jsp
效果: