<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    龍行天下

      政 博
    隨筆 - 23, 文章 - 0, 評論 - 12, 引用 - 0
    數據加載中……

    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");
    q.setFirstResult(10000);
    q.setMaxResults(100);
    List l = q.list();

    三、具體實現

    ?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;
    ? }

    ? public int getPageSize() {
    ??? return pageSize;
    ? }

    ? public void setTotalRows(int totalRows) {
    ??? this.totalRows = totalRows;
    ? }

    ? public void setStartRow(int startRow) {
    ??? this.startRow = startRow;
    ? }

    ? public void setTotalPages(int totalPages) {
    ??? this.totalPages = totalPages;
    ? }

    ? public void setCurrentPage(int currentPage) {
    ??? this.currentPage = currentPage;
    ? }

    ? public void setPageSize(int pageSize) {
    ??? this.pageSize = pageSize;
    ? }

    ? public int getTotalRows() {
    ??? return totalRows;
    ? }

    ? public void first() {
    ??? currentPage = 1;
    ??? startRow = 0;
    ? }

    ? public void previous() {
    ??? if (currentPage == 1) {
    ????? return;
    ??? }
    ??? currentPage--;
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void next() {
    ??? if (currentPage < totalPages) {
    ????? currentPage++;
    ??? }
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void last() {
    ??? currentPage = totalPages;
    ??? startRow = (currentPage - 1) * pageSize;
    ? }

    ? public void refresh(int _currentPage) {
    ??? currentPage = _currentPage;
    ??? if (currentPage > totalPages) {
    ????? last();
    ??? }
    ? }

    }

    Pager類用于計算首頁、前一頁、下一頁、尾頁的在數據庫中的起始行,當前的頁碼。

    2.PagerHelp類

    package com.jpcf.db.helper;

    import javax.servlet.http.*;

    public class PagerHelper {

    ? public static Pager getPager(HttpServletRequest httpServletRequest,int totalRows) {

    ??? //定義pager對象,用于傳到頁面
    ??? Pager pager = new Pager(totalRows);

    ??? //從Request對象中獲取當前頁號
    ??? String currentPage = httpServletRequest.getParameter("currentPage");

    ??? //如果當前頁號為空,表示為首次查詢該頁
    ??? //如果不為空,則刷新pager對象,輸入當前頁號等信息
    ??? if (currentPage != null) {
    ????? pager.refresh(Integer.parseInt(currentPage));
    ??? }

    ??? //獲取當前執行的方法,首頁,前一頁,后一頁,尾頁。
    ??? String pagerMethod = httpServletRequest.getParameter("pageMethod");

    ??? if (pagerMethod != null) {
    ????? if (pagerMethod.equals("first")) {
    ??????? pager.first();
    ????? } else if (pagerMethod.equals("previous")) {
    ??????? pager.previous();
    ????? } else if (pagerMethod.equals("next")) {
    ??????? pager.next();
    ????? } else if (pagerMethod.equals("last")) {
    ??????? pager.last();
    ????? }
    ??? }
    ??? return 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 class VehiclePropertyDAO {

    ? public Collection findWithPage(int pageSize, int 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.setFirstResult(startRow);
    ????? q.setMaxResults(pageSize);
    ????? vehicleList = q.list();
    ????? tx.commit();
    ??? } catch (HibernateException he) {
    ????? if (tx != null) {
    ??????? tx.rollback();
    ????? }
    ????? throw he;
    ??? } finally {
    ????? HibernateUtil.closeSession();
    ??? }
    ??? return vehicleList;
    ? }

    ? public int getRows(String query) throws HibernateException {
    ??? int totalRows = 0;
    ??? Transaction tx = null;
    ??? try {
    ????? Session session = HibernateUtil.currentSession();
    ????? tx = session.beginTransaction();
    ????? totalRows = ((Integer) session.iterate(query).next()).intValue();
    ????? tx.commit();
    ??? } catch (HibernateException he) {
    ????? if (tx != null) {
    ??????? tx.rollback();
    ????? }
    ????? throw he;
    ??? } finally {
    ????? HibernateUtil.closeSession();
    ??? }

    ??? return totalRows;
    ? }

    }
    DAO類我就貼這些分頁需要的代碼了。
    “from VehicleProperty vp”也可以用一個參數傳進來,有興趣的自己改一下吧

    4.Action

    下面是在Action中用到的代碼:
    ? public ActionForward execute(ActionMapping actionMapping,
    ???????????????????????????????????? ActionForm actionForm,
    ???????????????????????????????????? HttpServletRequest httpServletRequest,
    ???????????????????????????????????? HttpServletResponse httpServletresponse) {
    ???? Collection clInfos = null;//用于輸出到頁面的記錄集合
    ???? int totalRows;//記錄總行數
    ???? VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();

    ??? //取得當前表中的總行數
    ??? try {
    ????? totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
    ??? } catch (Exception ex) {
    ????? servlet.log(ex.toString());
    ????? return 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());
    ????? return actionMapping.findForward(Constants.FAILURE);
    ??? }

    ??? //把輸出的記錄集和pager對象保存到request對象中
    ??? httpServletRequest.setAttribute("CLINFOS", clInfos);
    ??? httpServletRequest.setAttribute("PAGER", pager);

    ??? return actionMapping.findForward(Constants.SUCCESS);
    ? }

    ?? 查詢語句select count(*) from VehicleProperty 也可以換成你需要的任意的條件(select count(*)?

    from VehicleProperty where ..)


    5.JSP頁面使用

    下面就是在JSP中的應用了:

    <td colspan="8" align="right" class="head">
    ?? 第<bean:write name="PAGER" property="currentPage"/>頁?
    ?? 共<bean:write name="PAGER" property="totalPages"/>頁?
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=previous"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">上一頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=next"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">下一頁</html:link>
    ?? <html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=last"?
    paramName="PAGER" paramProperty="currentPage" paramId="currentPage">尾頁</html:link>
    </td>

    ?? 解釋一下這一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first
    method=queryWithPage 是由于我的Action繼承的是DispatchAction,需要一個method參數
    pageMethod=first 是用來在PageHelper類中判斷執行哪個操作

    四、總結

    ??? 我做的這個也只是一個借鑒,還有很多沒有實現的,比如還可以加一下 go 直接到第n頁的功能。
    ??? 其實最關鍵的是把當前頁號和要執行的是功能(上一頁,下一頁)的參數從頁面傳進來,在Action中就可以根據這兩個參數去取下一個頁面上要顯示的記錄集了。

    posted on 2006-05-03 20:04 feingto 閱讀(413) 評論(0)  編輯  收藏 所屬分類: Java Web

    主站蜘蛛池模板: 久久国产乱子伦精品免费一 | 男女污污污超污视频免费在线看| 成人免费AA片在线观看| 亚洲精品私拍国产福利在线| 无码人妻AV免费一区二区三区| 亚洲成AV人片在线观看无| 久久成人免费播放网站| 亚洲最大成人网色| 国产免费AV片在线播放唯爱网| 亚洲一本之道高清乱码| 在线免费观看污网站| 最新亚洲人成网站在线观看| 亚洲人成人无码网www国产| 国产免费久久精品99久久| 亚洲女久久久噜噜噜熟女 | 免费能直接在线观看黄的视频| 亚洲最大的成网4438| 歪歪漫画在线观看官网免费阅读| 亚洲午夜无码毛片av久久京东热| 曰皮全部过程视频免费国产30分钟 | 亚洲AV无码一区二区乱子仑| 亚洲国产精品综合久久一线| 东北美女野外bbwbbw免费| 亚洲精品视频在线| 美女黄网站人色视频免费国产| 免费精品视频在线| 久久精品国产亚洲av麻| 好先生在线观看免费播放| 婷婷亚洲综合一区二区| 国产亚洲一区二区三区在线| 久久www免费人成看片| 无码天堂亚洲国产AV| 久久亚洲精品AB无码播放| 国产香蕉九九久久精品免费| www成人免费视频| 亚洲大香人伊一本线| 亚洲成av人在片观看| 69视频在线观看免费| 老司机免费午夜精品视频| 亚洲尹人香蕉网在线视颅| 免费爱爱的视频太爽了|