zoukankan      html  css  js  c++  java
  • 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 queryWithPage(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中的应用了: 第页 共页 ="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first 上一页 下一页 尾页 " paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首页 解释一下这一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first method=queryWithPage 是由于我的Action继承的是DispatchAction,需要一个method参数 pageMethod=first 是用来在PageHelper类中判断执行哪个操作 四、总结 我做的这个也只是一个借鉴,还有很多没有实现的,比如还可以加一下 go 直接到第n页的功能。 其实最关键的是把当前页号和要执行的是功能(上一页,下一页)的参数从页面传进来,在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了

  • 相关阅读:
    webpack-dev-server 源码
    2021前端会有什么新的变化
    父类 超类 基类 子类 派生类
    Java的权限修饰符(public,private,protected,默认friendly)
    class修饰符public、private、protected、static、abstract
    hash和签名 、证书
    前端加密解密crypto
    appid app_key app_secret
    sdk开发 、sdk与插件的区别
    CF76C
  • 原文地址:https://www.cnblogs.com/yurujun/p/2781497.html
Copyright © 2011-2022 走看看