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

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

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

    龍行天下

      政 博
    隨筆 - 23, 文章 - 0, 評(píng)論 - 12, 引用 - 0
    數(shù)據(jù)加載中……

    Struts+Hibernate開發(fā)實(shí)踐 分頁的實(shí)現(xiàn)

    在進(jìn)行web應(yīng)用開發(fā)的時(shí)候經(jīng)常要進(jìn)行分頁處理,經(jīng)常看到一些人在問分頁處理的問題,現(xiàn)在我把自己的處理方法寫在這兒,希望能對(duì)需要進(jìn)行分頁處理的朋友有所幫助。

    一、在struts中分頁有兩種結(jié)構(gòu):
    ??? 1. 在Action中通過DAO查詢出所有的記錄,然后加到session或request對(duì)象中,傳到客戶端,由JSP進(jìn)行分頁。這種方法對(duì)于在數(shù)據(jù)量少的時(shí)候很方便,也不影響速度。
    ??? 2.在Action中每次通過DAO只查詢出一頁的記錄,再傳給JSP頁面。這種結(jié)構(gòu)對(duì)于數(shù)據(jù)量大的程序很好,但對(duì)于數(shù)據(jù)量小的情況,會(huì)增加對(duì)服務(wù)器的請(qǐng)求,加大服務(wù)器的負(fù)載。
    ?????
    二、Hibernate查詢
    ??? 由于在Hibernate中直接提供了對(duì)數(shù)據(jù)庫定點(diǎn)定量的查詢方法,所以我采用的是第2種方法。

    如:
    從第1萬條開始取出100條記錄
    Query q = session.createQuery("from Cat as c");
    q.setFirstResult(10000);
    q.setMaxResults(100);
    List l = q.list();

    三、具體實(shí)現(xiàn)

    ?1.Pager類

    package com.jpcf.db.helper;

    import java.math.*;

    public class Pager {
    ? private int totalRows; //總行數(shù)
    ? private int pageSize = 10; //每頁顯示的行數(shù)
    ? private int currentPage; //當(dāng)前頁號(hào)
    ? private int totalPages; //總頁數(shù)
    ? private int startRow; //當(dāng)前頁在數(shù)據(jù)庫中的起始行

    ? 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類用于計(jì)算首頁、前一頁、下一頁、尾頁的在數(shù)據(jù)庫中的起始行,當(dāng)前的頁碼。

    2.PagerHelp類

    package com.jpcf.db.helper;

    import javax.servlet.http.*;

    public class PagerHelper {

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

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

    ??? //從Request對(duì)象中獲取當(dāng)前頁號(hào)
    ??? String currentPage = httpServletRequest.getParameter("currentPage");

    ??? //如果當(dāng)前頁號(hào)為空,表示為首次查詢?cè)擁?
    ??? //如果不為空,則刷新pager對(duì)象,輸入當(dāng)前頁號(hào)等信息
    ??? if (currentPage != null) {
    ????? pager.refresh(Integer.parseInt(currentPage));
    ??? }

    ??? //獲取當(dāng)前執(zhí)行的方法,首頁,前一頁,后一頁,尾頁。
    ??? 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這個(gè)類,我不用說應(yīng)該也知道用來干嘛了

    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”也可以用一個(gè)參數(shù)傳進(jìn)來,有興趣的自己改一下吧

    4.Action

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

    ??? //取得當(dāng)前表中的總行數(shù)
    ??? try {
    ????? totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
    ??? } catch (Exception ex) {
    ????? servlet.log(ex.toString());
    ????? return actionMapping.findForward(Constants.FAILURE);
    ??? }

    ??? //通過PagerHelper類來獲取用于輸出到頁面的pager對(duì)象
    ??? 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對(duì)象保存到request對(duì)象中
    ??? 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中的應(yīng)用了:

    <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,需要一個(gè)method參數(shù)
    pageMethod=first 是用來在PageHelper類中判斷執(zhí)行哪個(gè)操作

    四、總結(jié)

    ??? 我做的這個(gè)也只是一個(gè)借鑒,還有很多沒有實(shí)現(xiàn)的,比如還可以加一下 go 直接到第n頁的功能。
    ??? 其實(shí)最關(guān)鍵的是把當(dāng)前頁號(hào)和要執(zhí)行的是功能(上一頁,下一頁)的參數(shù)從頁面?zhèn)鬟M(jìn)來,在Action中就可以根據(jù)這兩個(gè)參數(shù)去取下一個(gè)頁面上要顯示的記錄集了。

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

    主站蜘蛛池模板: 最近的中文字幕大全免费版| 无码成A毛片免费| 91视频精品全国免费观看| 嫩草视频在线免费观看| 麻豆国产VA免费精品高清在线| 国产国产人免费视频成69大陆| 亚洲国产精品狼友中文久久久 | 免费观看四虎精品国产永久| 亚洲国产专区一区| 亚洲AV无码精品色午夜果冻不卡| 337p日本欧洲亚洲大胆色噜噜| 中国亚洲呦女专区| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 亚洲av永久无码天堂网| 免费一区二区无码视频在线播放| 成人免费av一区二区三区| 最近免费最新高清中文字幕韩国 | 国产成人免费A在线视频| 亚洲色婷婷六月亚洲婷婷6月| 免费观看的av毛片的网站| 亚洲国产精品一区二区第四页| 亚洲av鲁丝一区二区三区| 国产亚洲精aa在线看| 国产黄在线播放免费观看| 真人做人试看60分钟免费视频| 国产传媒在线观看视频免费观看 | 亚洲av日韩av激情亚洲| 亚洲一区二区三区91| 污污视频免费观看网站| 无码A级毛片免费视频内谢| 国产成人3p视频免费观看| 亚洲AV永久无码精品水牛影视| 亚洲成_人网站图片| 国产免费久久精品丫丫| 综合在线免费视频| 亚洲国产综合无码一区| 亚洲伊人久久大香线蕉AV| 国产婷婷成人久久Av免费高清| 免费看的成人yellow视频| 久久久久亚洲精品影视| 日韩色视频一区二区三区亚洲|