*** 一、分页数 ***
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(" ");
}
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();
}