strutshibernate:浅谈Struts分页中的Hibernate如何实现

  在进行web应用开发时候经常要对Struts分页处理经常看到些人在问Struts分页处理问题现在我把自己处理思路方法写在这儿希望能对需要进行Struts分页处理朋友有所帮助

  、在Struts分页有两种结构:

  1. 在Action中通过DAO查询出所有记录然后加到session或request对象中传到客户端由JSP进行分页

  这种思路方法对于在数据量少时候很方便也不影响速度

  2.在Action中每次通过DAO只查询出记录再传给JSP页面

  这种结构对于数据量大很好但对于数据量小情况会增加对服务器请求加大服务器负载

   2、Hibernate查询

  由于在Hibernate中直接提供了对数据库定点定量查询思路方法所以我采用是第2种思路方法

  如:

  从第1万条开始取出100条记录

Query q = session.createQuery("from Cat as c");
q.FirstResult(10000);
q.MaxResults(100);
List l = q.list;


   3、具体实现

  1.Pager类

package com.jpcf.db.helper;



import java.math.*;
public  Pager {
private  totalRows; //总行数
private  pageSize = 10; //每页显示行数
private  currentPage; //当前页号
private  totalPages; //总页数
private  startRow; //当前页在数据库中起始行
public Pager {
}
public Pager( _totalRows) {
totalRows = _totalRows;
totalPages=totalRows/pageSize;
 mod=totalRows%pageSize;
(mod>0){
totalPages;
}
currentPage = 1;
startRow = 0;
}
public  getStartRow {
 startRow;
}
public  getTotalPages {
 totalPages;
}
public  getCurrentPage {
 currentPage;
}
public  getPageSize {
 pageSize;
}
public void TotalRows( totalRows) {
this.totalRows = totalRows;
}
public void StartRow( startRow) {
this.startRow = startRow;
}
public void TotalPages( totalPages) {
this.totalPages = totalPages;
}
public void CurrentPage( currentPage) {
this.currentPage = currentPage;
}
public void PageSize( pageSize) {
this.pageSize = pageSize;
}
public  getTotalRows {
 totalRows;
}
public void first {
currentPage = 1;
startRow = 0;
}
public void previous {
 (currentPage  1) {
;
}
currentPage--;
startRow = (currentPage - 1) * pageSize;
}
public void next {
 (currentPage < totalPages) {
currentPage;
}
startRow = (currentPage - 1) * pageSize;
}
public void last {
currentPage = totalPages;
startRow = (currentPage - 1) * pageSize;
}
public void refresh( _currentPage) {
currentPage = _currentPage;
 (currentPage > totalPages) {
last;
}
}
}


  Pager类用于计算首页、前页、下页、尾页在数据库中起始行当前页码

  2.PagerHelp类

package com.jpcf.db.helper;
 
import javax.servlet.http.*;
public  PagerHelper {
public  Pager getPager(HttpServletRequest httpServletRequest,
 totalRows) {
//定义pager对象用于传到页面
Pager pager =  Pager(totalRows);
//从Request对象中获取当前页号
String currentPage = httpServletRequest.getParameter("currentPage");
//如果当前页号为空表示为首次查询该页
//如果不为空则刷新pager对象输入当前页号等信息
 (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
}
//获取当前执行思路方法首页尾页
String pagerMethod = httpServletRequest.getParameter("pageMethod");
 (pagerMethod != null) {
 (pagerMethod.equals("first")) {
pager.first;
}   (pagerMethod.equals("previous")) {
pager.previous;
}   (pagerMethod.equals("next")) {
pager.next;
}   (pagerMethod.equals("last")) {
pager.last;
}
}
 pager;
}
}


  PageHelper这个类我不用说应该也知道用来干嘛了

  3.DAO类

package com.jpcf.db.dao;
 
import com.jpcf.db.model.*;
import com.jpcf.db.helper.HibernateUtil;
import net.sf.hibernate.*;
import java.util.*;
import com.jpcf.db.controller.*;
public  VehiclePropertyDAO {
public Collection findWithPage( pageSize,  startRow) throws
HibernateException {
Collection vehicleList = null;
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession;
tx = session.beginTransaction;
Query q = session.createQuery("from VehicleProperty vp");
q.FirstResult(startRow);
q.MaxResults(pageSize);
vehicleList = q.list;
tx.commit;
} catch (HibernateException he) {
 (tx != null) {
tx.rollback;
}
throw he;
} finally {
HibernateUtil.closeSession;
}
 vehicleList;
}
public  getRows(String query) throws
HibernateException {
 totalRows = 0;
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession;
tx = session.beginTransaction;
totalRows = ((Integer) session.iterate(query).next).
Value;
tx.commit;
} catch (HibernateException he) {
 (tx != null) {
tx.rollback;
}
throw he;
} finally {
HibernateUtil.closeSession;
}
 totalRows;
}
}


  DAO类我就贴这些分页需要代码了

  “from VehicleProperty vp”也可以用个参数传进来有兴趣自己改下吧

  4.Action

  下面是在Action中用到代码:

public ActionForward queryWithPage(ActionMapping actionMapping,
 
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletresponse) {
Collection clInfos = null;//用于输出到页面记录集合
 totalRows;//记录总行数
VehiclePropertyDAO vehicleDAO =  VehiclePropertyDAO;
//取得当前表中总行数
try {
totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
} catch (Exception ex) {
servlet.log(ex.toString);
 actionMapping.findForward(Constants.FAILURE);
}
//通过PagerHelper类来获取用于输出到页面pager对象
Pager pager=PagerHelper.getPager(httpServletRequest,totalRows);
//取出从startRow开始pageSize行记录
try {
clInfos = vehicleDAO.findWithPage(pager.getPageSize, pager.getStartRow);
} catch (Exception ex) {
servlet.log(ex.toString);
 actionMapping.findForward(Constants.FAILURE);
}
//把输出记录集和pager对象保存到request对象中
httpServletRequest.Attribute("CLINFOS", clInfos);
httpServletRequest.Attribute("PAGER", pager);
 actionMapping.findForward(Constants.SUCCESS);
}




  查询语句select count(*) from VehicleProperty 也可以换成你需要任意条件(select count(*) from VehicleProperty where ..)

  5.JSP页面使用

  下面就是在JSP中应用了: 

="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first
" paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首页


  解释下这行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first

  method=queryWithPage 



Tags:  struts分页 hibernate分页 struts2hibernate strutshibernate

延伸阅读

最新评论

发表评论