好久没逛iteye呢,这两天空闲,聊下分页。
这是我从easyui 和 hibernate 的共同点总结得出的。
其他框架其实完全一样。
先看easyui的请求参数:只有两个。
rows :每页数据行 page: 第几页
再看hibernate的参数,也只需要两个。
query.setFirstResult() query.setMaxResults()
所以实际上,任何分页组件只需要两个参数,我们用java类进行封装。
public class Page { private int page; private int rows; ...set.get //获取开始行号的函数,还是由page,rows两个参数计算得到 public int getFirstResult() { return (page - 1) * rows; } }
一、第一个问题:数据放在哪里?总行数放哪里?有几种方案提供参考:
1、
public class Page { private int page; private int rows; //数据:作为一个属性放在page里 private list data; //总行数:作为一个属性放在page里 private int total; public int computeFirstResult() { return (page - 1) * rows; } }
2、
public class Grid{ //分页对象 private Page page; //其他分页相关的对象,比如orderby .......... //数据:作为一个属性放在page里 private list data; //总行数:作为一个属性放在page里 private int total; }
申明一个类,将page,data,total,作为其中一个属性存在。
二、第二个问题:hibernate分页代码如何写。
// 分页查询 public void queryGrid(String sql, Grid grid) { Session session = sessionFactory.getCurrentSession(); // 总页数 String countSql = select count(*) from(" "+ sql + " ") as TEMP_TOTAL; Object o = session.createSQLQuery(countSql).uniqueResult(); int total = Integer.valueOf(o.toString()); // 本页数据 Query query = session.createSQLQuery(sql).setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP); query.setFirstResult(grid.getPage().getFirstResult()); query.setMaxResults(grid.getPage().getRows()); List list = query.list(); //设置分页数据、总行数 grid.setData(list); grid.gePage.setTotal(total); }
应该走出这样的误区:t
1、分页调用两次函数才能完成,看到很多这样的设计。 一个函数获取total总行数,一个函数获取data的函数。 2、可以参考queryGrid()。 不一定就需要有返回值。即使有,也不应该是list对象,否则total属性会丢失。
三、第三个问题:Page或者Grid对象由谁来创建。
不应该是业务程序员来创建,肯定是框架来实现。
也就是说你的业务代码中不应该有下面的代码:
page.setPage(request.getParmeter());
四、第四个问题:分页数据、分页工具栏如何剥离?
1、我用的easyui分页,所以没有自己写代码,相信你一定也可以做到。
2、我只证明说一下:easyui的grid响应只需要两个值:
data:数据 total:总行数
因为easyui是ajax请求数据,只用这以上两参数做出呢下面的分页栏。
熟悉easyui的朋友可以自我联想。
3、实际上可能你还还需要2个参数,也就是第一段代码的2个参数。
page:第几数 rows:每页多少行
五、第五个问题:ToolBar和通用性。
这里用hibernate举例而已,换成jdbc其实也一样。
easyui的参数可以照搬,不用他的分页组件。
1、 所以正宗的分页toolbar应该用js来创建。
如此简单的事情,不会难倒你的。
2、简单一点的用的方法导入分页jsp页面。
3、最后一点最重要,提供一些思路。
上一页页码、下一页页码、是否有上一页、下一页等。 这些是神马概念哪里去呢? 这些是函数,不是属性值。 这些函数由上面提到的4个参数计算而出,所以这些最好由前面的Toolbar来做,做成 javascript 函数。
4、以最小职责为原则,绝不越位,满足90%功能的Page。
public class Page { private int page; private int rows; private int total; private list data; //page.set.get //rows.set.get //total.set.get //data.set.get public int computeFirstResult() { return (page - 1) * rows; } }
一点思路,抛砖引玉,随意吐槽。
工作马上就没呢,悲剧啊。