在进行web应用开发的时候经常要对Struts分页处理经常看到一些人在问Struts分页处理的问题现在我把自己的处理方法写在这儿希望能对需要进行Struts分页处理的朋友有所帮助
一在Struts分页有两种结构
在Action中通过DAO查询出所有的记录然后加到session或request对象中传到客户端由JSP进行分页
这种方法对于在数据量少的时候很方便也不影响速度
在Action中每次通过DAO只查询出一页的记录再传给JSP页面
这种结构对于数据量大的程序很好但对于数据量小的情况会增加对服务器的请求加大服务器的负载
二Hibernate查询
由于在Hibernate中直接提供了对数据库定点定量的查询方法所以我采用的是第种方法
如
从第万条开始取出条记录
Query q = sessioncreateQuery(from Cat as c);
qsetFirstResult();
qsetMaxResults();
List l = qlist();
三具体实现
Pager类
package comjpcfdbhelper;
import javamath*;
public class Pager {
private int totalRows; //总行数
private int pageSize = ; //每页显示的行数
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>){
totalPages++;
}
currentPage = ;
startRow = ;
}
public int getStartRow() {
return startRow;
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setTotalRows(int totalRows) {
thistotalRows = totalRows;
}
public void setStartRow(int startRow) {
thisstartRow = startRow;
}
public void setTotalPages(int totalPages) {
thistotalPages = totalPages;
}
public void setCurrentPage(int currentPage) {
thiscurrentPage = currentPage;
}
public void setPageSize(int pageSize) {
thispageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void first() {
currentPage = ;
startRow = ;
}
public void previous() {
if (currentPage == ) {
return;
}
currentPage;
startRow = (currentPage ) * pageSize;
}
public void next() {
if (currentPage < totalPages) {
currentPage++;
}
startRow = (currentPage ) * pageSize;
}
public void last() {
currentPage = totalPages;
startRow = (currentPage ) * pageSize;
}
public void refresh(int _currentPage) {
currentPage = _currentPage;
if (currentPage > totalPages) {
last();
}
}
Pager类用于计算首页前一页下一页尾页的在数据库中的起始行当前的页码
PagerHelp类
package comjpcfdbhelper;
import javaxservlethttp*;
public class PagerHelper {
public static Pager getPager(HttpServletRequest httpServletRequest
int totalRows) {
//定义pager对象用于传到页面
Pager pager = new Pager(totalRows);
//从Request对象中获取当前页号
String currentPage = (currentPage);
//如果当前页号为空表示为首次查询该页
//如果不为空则刷新pager对象输入当前页号等信息
if (currentPage != null) {
pagerrefresh(IntegerparseInt(currentPage));
}
//获取当前执行的方法首页前一页后一页尾页
String pagerMethod = (pageMethod);
if (pagerMethod != null) {
if (pagerMethodequals(first)) {
pagerfirst();
} else if (pagerMethodequals(previous)) {
pagerprevious();
} else if (pagerMethodequals(next)) {
pagernext();
} else if (pagerMethodequals(last)) {
pagerlast();
}
}
return pager;
}
PageHelper这个类我不用说应该也知道用来干嘛了
DAO类
package comjpcfdbdao;
import comjpcfdbmodel*;
import comjpcfdbhelperHibernateUtil;
import netsfhibernate*;
import javautil*;
import ntroller*;
public class VehiclePropertyDAO {
public Collection findWithPage(int pageSize int startRow) throws
HibernateException {
Collection vehicleList = null;
Transaction tx = null;
try {
Session session = HibernateUtilcurrentSession();
tx = sessionbeginTransaction();
Query q = sessioncreateQuery(from VehicleProperty vp);
qsetFirstResult(startRow);
qsetMaxResults(pageSize);
vehicleList = qlist();
mit();
} catch (HibernateException he) {
if (tx != null) {
txrollback();
}
throw he;
} finally {
HibernateUtilcloseSession();
}
return vehicleList;
}
public int getRows(String query) throws
HibernateException {
int totalRows = ;
Transaction tx = null;
try {
Session session = HibernateUtilcurrentSession();
tx = sessionbeginTransaction();
totalRows = ((Integer) erate(query)next())
intValue();
mit();
} catch (HibernateException he) {
if (tx != null) {
txrollback();
}
throw he;
} finally {
HibernateUtilcloseSession();
}
return totalRows;
}
DAO类我就贴这些分页需要的代码了
from VehicleProperty vp也可以用一个参数传进来有兴趣的自己改一下吧
Action
下面是在Action中用到的代码/
public ActionForward queryWithPage(ActionMapping actionMapping
ActionForm actionForm
HttpServletRequest httpServletRequest
HttpServletResponse httpServletresponse) {
Collection clInfos = null;//用于输出到页面的记录集合
int totalRows;//记录总行数
VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();
//取得当前表中的总行数
try {
totalRows = vehicleDAOgetRows(select count(*) from VehicleProperty);
} catch (Exception ex) {
servletlog(extoString());
return actionMappingfindForward(ConstantsFAILURE);
}
//通过PagerHelper类来获取用于输出到页面的pager对象
Pager pager=PagerHelpergetPager(httpServletRequesttotalRows);
//取出从startRow开始的pageSize行记录
try {
clInfos = vehicleDAOfindWithPage(pagergetPageSize() pagergetStartRow());
} catch (Exception ex) {
servletlog(extoString());
return actionMappingfindForward(ConstantsFAILURE);
}
//把输出的记录集和pager对象保存到request对象中
(CLINFOS clInfos);
(PAGER pager);
return actionMappingfindForward(ConstantsSUCCESS);
查询语句select count(*) from VehicleProperty 也可以换成你需要的任意的条件(select count(*) from VehicleProperty where )
JSP页面使用
下面就是在JSP中的应用了
=/bussiness/clInfo/queryWithPagedo?method=queryWithPage&pageMethod=first
paramName=PAGER paramProperty=currentPage paramId=currentPage>首页
解释一下这一行:/bussiness/clInfo/queryWithPagedo?method=queryWithPage&pageMethod=first
method=queryWithPage
是由于我的Action继承的是DispatchAction
需要一个method参数
pageMethod=first 是用来在PageHelper类中判断执行哪个操作
四Struts分页总结
我做的这个也只是一个借鑒还有很多没有实现的比如还可以加一下 go 直接到第n页的功能
其实最关键的是把当前页号和要执行的是功能(上一页下一页)的参数从页面传进来在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了