Hibernate实现分页功能逻辑分析

***  一、分页数  ***

1、计算页数=数据总数/每页的记录条数
   pager.setPageCount(list.size()/pager.getPageSize());

   //如果除不尽,再加一页

public void initPage(Pager pager)
	{
		String hql="from Room";
		session=HibernateUtil.openSession();		
		Query query = session.createQuery(hql);
		Transaction tx=session.beginTransaction();
		List<Room> list=query.list();
		//计算总页数
		pager.setPageCount(list.size()/pager.getPageSize());
		//如果除不尽,再加一页
		if(list.size()%pager.getPageSize()>0)
		{
			pager.setPageCount(pager.getPageCount()+1);
		}
		tx.commit();
		session.close();
		
	}

2、计算当前页从第几条记录开始显示 
   当前是第一页,每页显示10条数据
   第一页显示0 - 9      (page-1)*pageSize
   第二页显示10 - 19    (page-1)*pageSize

    当前是第page页,每页显示pager.PageSize条数据
    (page-1)*pager.PageSize

public List<Room> getRooms(Pager pager)
	{
		String hql="from Room";
		session=HibernateUtil.openSession();		
		Query query = session.createQuery(hql);
		Transaction tx=session.beginTransaction();
		
		//返回当前页记录
		//1、设置当前页从第几条记录开始显示
        if(pager.getPageNo()==0)
		{
			pager.setPageNo(1);
		}
		query.setFirstResult((pager.getPageNo()-1)*pager.getPageSize());
		//2、最多显示多少条数据
		query.setMaxResults(pager.getPageSize());
		List<Room> list=query.list();
		tx.commit();
		session.close();
		return list;
	}

3、页面没有提交page时,默认是0,需要做判断,if(page==0){ page=1; }

*** 二、分页导航按钮 ***

1、获取每页按钮数 int btns=pager.getBtnCount();

2、按钮一半放前面,一半放后面 btns=btns/2;

3、起点位置:int start=page-btns;

4、终点位置:int end=page+btns;

5、start不能为负数,需要从第1开始,page-btns;可能是负数,做判断
    if(start<1)
    {
        start=1;
        end=start+2*btns;
    }

6、end不能超过总页数。做判断
    if(end>pager.getPageCount())
    {
        end=pager.getPageCount();
        start=end-2*btns;
    }

7、循环打印
    定义变量StringBuilder str=new StringBuilder();

                for(int i=start;i<=end;i++)
			{
				str.append("<a href='"+ req.getContextPath() +"/room/main?page="+ i +"'>");
				if(i==page)
				{
					str.append("<font color='red'><b>");
					str.append(i);
					str.append("</b></font>");
				}
				else
				{
					str.append(i);
				}
				str.append("</a>");
				str.append("&nbsp;&nbsp;");
			}
			str.append("<br/>");
			ctx.put("NAVBAR",str.toString());
			System.out.println(str.toString());

*** 三、删除数据,留在当前页 ***

1、跳转的页面上,加当前页面page变量值。
   因为删除方法是从room delete action转到 main action中,属于同一次请求,所以保存在ActionContext范围的page 在前端    
    room.jsp可以获取。

2、如果最后一页只有1条数据,删除后,不能留在当前页,需要做判断。

     把当前页page的值等于最大页数值。
        Pager pager=new Pager();
        //获取总页数
        dao.initPage(pager);
        //如果当前页大于总页数,就让它等于总页数
        if(page>pager.getPageCount())
        {
            page=pager.getPageCount();
        }

*** 四、修改数据,留在当前页 ***

1、点击保存后跳转的页面,加当前page变量。

*** 五、添加数据,转到最后一页 ***

1、修改和添加都是调同一个update action。

2、因为修改的时候,跳转的页面加了page,所以会留在当前页,这样的话,添加时就需要去修改page。

3、做判断,如果修改就留在当前页,如果是添加,就转到最后一页。

   分析:如果是添加,id=0;做一个ADD标志(true是这里是什么都没关系)。 如果是修改,id>0

  public String update()
    {
        if(room.getId()==0)
        {
            ServletActionContext.getContext().put("ADD", true);
        }
        dao.update(room);
        return main();
    }

 转到main方法:
  在main方法里判断,如果收到的ADD值不为空,说明是添加数据,把当前页page设置为总页数值。

      if(ServletActionContext.getContext().get("ADD")!=null) 
    {
        page=pager.getPageCount();
    }

猜你喜欢

转载自blog.csdn.net/tangbin0505/article/details/82081609