ssh之雇员管理系统(10)-分页实现

一、分页的实现原理

  1. 得到数据库的总记录为query.list,当前页数pageNow,每页显示多少记录pageSize,一共多少条记录cowPage
  2. 分别求出以上的数据,根据以上的数据配置出不同的求法
  • showListEmp函数用于显示数据库的所有记录,那我们想,他有几个参数呢?pageNow和pageSize,传入两个参数,当前页是在我们点击页面的数字要进入的页面,即根据当前的页和每页显示多少记录来显示记录,那他返回的一定是个集合,这样我们就很好的显示出来啦。

我们知道数据库语句啦,但是如何显示pageSize条记录呢?

    public List showListEmp(int pageNow, int pageSize) {
        String hql = "from Employee  order by id";//查询所有
        return this.executeQueryByPage(hql, null, pageNow, pageSize);
//        return this.executeQuery(hql, null);
        
    }
    public List executeQueryByPage(String hql, Object[] parameters,
            int pageNow, int pageSize) {
        Query query = this.sessionFactory.getCurrentSession().createQuery(hql);
//        System.out.println("query="+query.list());
        if (parameters != null && parameters.length > 0) {
            for (int i = 0; i < parameters.length; i++) {
                query.setParameter(i, parameters[i]);
            }
        }
//        System.out.println("list="+query.setFirstResult((pageNow-1)*pageSize).list());
//        System.out.println("pageNow="+pageNow+pageSize);
        return query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize).list();
    }

这里我们让他去调用两外一个公用的函数executeQueryByPage方法,通过query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize).list()来返回list集合。

  • 那我们现在要知道有多少页,才能做分页,现在我们要怎样求得页数呢?

首先countEmp函数用于查找所有的记录数

    public int countEmp(int pageSize) {
        String hql = "select count(*) from Employee";//查询记录数
        return this.queryPageCount(hql, null, pageSize);
        
    }
    /**
     * 分页查询
     */
    public int queryPageCount(String hql, Object[] parameters, int pageSize) {
        Object object = this.uniqueQuery(hql, null);
        int cowPage = Integer.parseInt(object.toString());
        System.out.println("cowPage="+cowPage+"* "+object);
        return (cowPage-1)/(pageSize+1);
    }
    /**
     * 查询条数
     */
    public Object uniqueQuery(String hql, Object[] parameters) {
        Query query = this.sessionFactory.getCurrentSession().createQuery(hql);
        if (parameters != null && parameters.length > 0) {
            for (int i = 0; i < parameters.length; i++) {
                query.setParameter(i, parameters[i]);
            }
        }
        return query.uniqueResult();
    }

这样层层嵌套即可查询所需要饿

  • 在action中怎样跳转呢?而且怎样得到当前页面数呢?我们就在页面中当点击一个数时,传入一个数
        public ActionForward goListEmp(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception{
            String s_pageNow=request.getParameter("pageNow");
            int pageNow=1;
            if(s_pageNow!=null){
                pageNow=Integer.parseInt(s_pageNow);
            }
    //        System.out.println("pageNow="+pageNow);
            
            
            // TODO Auto-generated method stub
            request.setAttribute("emplist", employeeServiceInter.showListEmp(pageNow,3));
            //测试
            int pageCount=employeeServiceInter.countEmp(3);
    //        System.out.println("pageCount="+pageCount);
            request.setAttribute("pageCount", pageCount);
            
            //打通线路
            return mapping.findForward("goListEmp");
        }
  • 页面中怎样引用呢?
     <c:forEach var="i" begin="1" end="${pageCount}">
        <a href="${pageContext.request.contextPath}/employee.do?flag=goListEmp&pageNow=${i }">${i }</a>
        </c:forEach>

     

posted @ 2013-05-16 13:08  Tim&Blog  阅读(295)  评论(0编辑  收藏  举报