ssh框架分页(包括如何对多对多关系获得的set集合中的记录进行分页)
(1)首先写一个PageModel类,里面写了获得pageNo(当前页数),pageSize(每页显示的条数),data(每页显示的记录),recordcount(总的记录数)的get,set方法下面的方法。
(2)在泛型Dao(GenericDaoImpl)中的写如下方法getByPager,可供其他的Dao类调用,调用时T需要换成相应的对象类型。
public PageModel<T> getByPager(int pageNo,int pageSize)
throws DaoException {
PageModel<T> pm = new PageModel<T>();
//当前页码
pm.setPageNo(pageNo);
//每页显示的记录数
pm.setPageSize(pageSize);
Long count = (Long) sessionFactory.getCurrentSession().createQuery(
"selectcount(o) from " +clazz.getName() + " o")
.uniqueResult();
if (count !=null && count.longValue() > 0) {
//总记录数
pm.setRecordCount(count.longValue());
List<T> list = sessionFactory.getCurrentSession().createQuery(
"from " + clazz.getName() + " oORDER BY o DESC")
.setFirstResult((pageNo - 1) *pageSize).setMaxResults(
pageSize).list();
//获取的集合
pm.setData(list);
}
return pm;
}
(3)action通过service调用Dao层的getByPager方法,同时传入pageSize和pageNo(可以是在action里面写死定义好的)获得pagerModel对象,再用该对象调用相应的get方法,将pageNo(当前页数),pageSize(每页显示的条数),data(每页显示的记录),recordcount(总的记录数)得到,保存到session里。
(4)在相应的jsp页面加pagerlib标签
<%@ tagliburi="http://blog.csdn.net/qjyong/tags/pager"prefix="q"%>
在相应的部分写上从session里面获得的值
<c:forEachitems="${sessionScope.data}"var="wn"varStatus="vs">
对获得的每一条记录的操作
</c:forEach>
<div class="actions">
<q:pagerpageSize="${sessionScope.pageSize}"
pageNo="${sessionScope.pageNo}"
url="MyEngLearn/frame/templateFrame.action"//分页操作对应的action中的方法
recordCount="${sessionScope.recordCount}"/>
</div>
当需要分页的内容是从多对多关系的set集合里取出的数据时,需要改写getByPager方法:把set集合转换成数组,再定义一个list集合,利用for循环遍历取出数组中的每一个元素,分别存放到list集合里,再将给list集合用set方法保存在pageModel对象中,进而在action里面用get方法获取。如下:(红色注解为过程)
public PageModel<Resource> getMyResByPager(int pageNo,int pageSize, int uid) {
PageModel<Resource> pm = new PageModel<Resource>();
// 当前页码
pm.setPageNo(pageNo);
// 每页显示的记录数
pm.setPageSize(pageSize);
Query q=this.sessionFactory.getCurrentSession().createQuery("from User where UId=?");
q.setParameter(0,uid);
User u=(User)q.uniqueResult();//获得多对多关系中的一方User对象U
Hibernate.initialize(u.getResset());//解决no session或session is closed的问题
Set<Resource> myrset=u.getResset();//获得存放多对多中另一方对象(Resource)的set集合
List<Resource> myrlist=new ArrayList<Resource>();//创建一个list集合用于存放每页显示的记录
Object[] rarray=myrset.toArray();//将存放Resource对象的集合转化成数组
for(int i=(pageNo-1)*pageSize;i<pageSize*pageNo;i++)
{ if(myrset.size()>i){
Resource r=(Resource) rarray[i];//获得数组中的每一个对象
myrlist.add(r);//将这个对象加入到之前创建好的list集合中
}
else
{
break;
}
}//遍历该数组,(pageNo-1)*pageSize为每页显示的第一条记录的id,pageSize*pageNo-1为每页显示的最后一条记录的id
// 总记录条数
Long count =(long)myrset.size();
if (count !=null && count.longValue() > 0) {
// 总记录数
pm.setRecordCount(count.longValue());
// 获取的集合
pm.setData(myrlist);//把存放有每页应显示数据的list集合赋值给pagerModel对象。
}
return pm;
}
昨天发现这个方法有一个问题,就是set集合里面存放的数据是无序的,所以分页是取出的记录会乱串,在网上查到注解或者配置文件都可以用order by来让set集合里面的记录按某一列顺序排列,但是自己没有成功。还希望知道怎么做的朋友,可以告诉我应该怎么使set集合里面的记录顺序取出?
后来自己还是用了一个很笨的方法,就是没用set集合,而用了list集合,在action中向list集合里面添加Resource对象时,手动写方法对list集合里面的对象进行遍历,如果有相同的就不向list集合里面加了,这样集合里面就不会有重复的数据,而且取出时也不会乱串了。虽然得到了想要的效果,但很麻烦,其实并没有真的解决问题。