熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

淺談Struts分頁中的Hibernate如何實現

2013-11-23 20:33:58  來源: Java開源技術 

  在進行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中就可以根據這兩個參數去取下一個頁面上要顯示的記錄集了


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28681.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.