关于Struts+Hibernate分页的问题,从四个方面阐述。包括在在Struts中分页有两种结构、Hibernate查询等。
在进行web运用开发的时分常常要进行分页处理,常常看到一些人在问分页处理的问题,现在我把自己的处理办法写在这儿,期望能对需求进行分页处理的朋友有所协助。
一、在Struts中分页有两种结构:
1. 在Action中经过DAO查询出一切的记载,然后加到session或request目标中,传到客户端,由JSP进行分页。这种办法关于在数据量少的时分很便利,也不影响速度。
2.在Action中每次经过DAO只查询出一页的记载,再传给JSP页面。这种结构关于数据量大的程序很好,但关于数据量小的状况,会增加对服务器的恳求,加大服务器的负载。
二、Hibernate查询
因为在Hibernate中直接供给了对数据库定点定量的查询办法,所以我选用的是第2种办法。
如:从第1万条开端取出100条记载
Query q = session.createQuery("from Cat as c");
|
三、详细完成
1.Pager类
package com.jpcf.db.helper;
import java.math.*;
public class Pager {
private int totalRows; //总行数
private int pageSize = 10; //每页显现的行数
private int currentPage; //当时页号
private int totalPages; //总页数
private int startRow; //当时页在数据库中的起始行
public Pager() {
}
public Pager(int _totalRows) {
totalRows = _totalRows;
totalPages=totalRows/pageSize;
int mod=totalRows%pageSize;
if(mod>0){
totalPages++;
}
currentPage = 1;
startRow = 0;
}
public int getStartRow() {
return startRow;
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();0
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();1
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();2
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();3
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();4
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();5
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();6
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();7
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();8
q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();9
package com.jpcf.db.helper;0
package com.jpcf.db.helper;1
Pager类用于核算主页、前一页、下一页、尾页的在数据库中的起始行,当时的页码。
2.PagerHelp类
package com.jpcf.db.helper; package com.jpcf.db.helper;3 package com.jpcf.db.helper;4 package com.jpcf.db.helper;5 |
//界说pager目标,用于传到页面
package com.jpcf.db.helper;6 |
//从Request目标中获取当时页号
package com.jpcf.db.helper;7 |
//假如当时页号为空,表明为***查询该页
//假如不为空,则改写pager目标,输入当时页号等信息
package com.jpcf.db.helper;8 |
//获取当时履行的办法,主页,前一页,后一页,尾页。
package com.jpcf.db.helper;9 import java.math.*;0 |
PageHelper这个类,我不用说应该也知道用来干嘛了
3.DAO类
import java.math.*;1
import java.math.*;2
import java.math.*;3
import java.math.*;4
import java.math.*;5
import java.math.*;6
import java.math.*;7
DAO类我就贴这些分页需求的代码了。
“from VehicleProperty vp”也能够用一个参数传进来,有爱好的自己改一下吧
4.Action
下面是在Action中用到的代码:
import java.math.*;8 |
Collection clInfos = null;//用于输出到页面的记载调集
int totalRows;//记载总行数
import java.math.*;9 |
//获得当时表中的总行数
try { |
//经过PagerHelper类来获取用于输出到页面的pager目标
public class Pager { |
//取出从startRow开端的pageSize行记载
try { |
//把输出的记载集和pager目标保存到request目标中
public class Pager { return actionMapping.findForward(Constants.SUCCESS); |
查询句子select count(*) from VehicleProperty 也能够换成你需求的恣意的条件(select count(*) from VehicleProperty where ..)
5.JSP页面运用
下面就是在JSP中的运用了:
public class Pager { |
解释一下这一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first
method=queryWithPage 是因为我的Action承继的是DispatchAction,需求一个method参数
pageMethod=first 是用来在PageHelper类中判别履行哪个操作
四、总结
我做的这个也仅仅一个学习,还有许多没有完成的,比方还能够加一下 go 直接到第n页的功用。
其实最要害的是把当时页号和要履行的是功用(上一页,下一页)的参数从页面传进来,在Action中就能够依据这两个参数去取下一个页面上要显现的记载集了。
【修改引荐】
- OpenCore: OSGi上布置Hibernate的四种办法
- Hibernate单元测试的办法HSQLDB胪陈
- 解析Hibernate的批量删去功用
- 层层解析Hibernate中的业务的乱用