我相信大家从数据来源拿到数据后一般都会有做分页处理。
二话不说,需要通过jsp将当前页面的currpage 和pagesize 通过(如果是异步的话,直接用querybean接收这两个值会更好一些)querybean传到Control、servlet层或者action进行处理,然后调service—>dao的方法进行查询,将返回结果放入querybean中传到jsp界面进行数据加载.方法大同小异。querybean如下:
private int currPage=1;//当前页码
private int pageSize=5;//页面显示的记录数
private int count;//总记录数
private int startIndex;//查询的起始下标
private int endIndex;//查询的结束下标
private List<E> list;//查询获取到的数据
这种思想:
1、页码越界操作必须在jsp中通过脚本判断完成。
2、如果判断不成立,不需要发送请求。
解释上面提及传querybean:
直接用querybean接收,可以直接将querybean传到service层进行数据处理,通过get方法拿值。可以减少控制层的逻辑处理
3、通过伪列rownum的分页条件必须在控制层或者service层实现,也有直接在sql语句中通过计算实现
进入正题,说说本人学到的一个思想;
开始之前,说明一下,这里主要针对第3小点展开思想拓展
抛出疑问:既然在查询语句中必须要得到查询的伪列的区间数值,而且我在一开始亮出的querybean中又包含了这两个成员变量,并且我传入的也是querybean对象,为何不能好好利用起来startIndex;//查询的起始下标和endIndex;//查询的结束下标?
抛出代码
public int getStartIndex() {//计算 起始下标
if(this.currPage>Math.ceil((this.count*1.0/this.pageSize))){//假设 当前页码超出范围 按照最后一页算
this.currPage=(int) Math.ceil((this.count*1.0/this.pageSize));
}
if(this.currPage<=1){
this.currPage=1;//如果传入的当前页码小于1 就按照1来算
}
startIndex=(this.currPage-1)*pageSize+1;//查询的起始下标=(当前页码-1)*页面显示的记录数+1
return startIndex;
public int getEndIndex() {//计算 结束下标
endIndex=this.getStartIndex()+pageSize-1;//结束下标=起始下标+页面显示的条数-1
return endIndex;
}
解释:
既然在网页中传入了当前页面和页面显示数据,那我们就直接在querybean中通过getStartIndex ,getEndIndex两个get方法,在方法中直接调用currPage,pageSize的get方法拿到这两个值,然后得到查询数据的其实和结束,这样就可以直接在sql语句中使用这两个成员变量的值。
而且还可以将jsp的脚本所需要进行的页面越界操作的判断在这里直接解决掉。
注意:大家可以发现getStartIndex ,getEndIndex方法中,用到了 count;//总记录数,因此,我们必须要在控制层先调方法获得 count;//总记录数,通过set方法注入querybean对象;
总结:
两种思想的数据处理的切入点不同;
而且发请求的方法也完全改变,在jsp中通过脚本进行分页越界的判断,可以过滤一些不必要发送的请求。
而在querybean中处理的话,请求总是都会发送,只是处理的数据不同而已,
因此,方法灵活多变,没有最好的方法,只有更合适的方法