日期:2014-05-16 浏览次数:20491 次
?做本人用jsp+hibernate 设计了一个小的论坛,完全只是把基本的功能搭建尝试下。
下图为本人的数据库关系图。one2many or many2one 相比都不用说了,一看就了解。
?lt_fl表:就是论坛的模块表
lt_tz表:就是论特帖子表
lt_user表:就是论坛的用户表
lt_rep表就是论坛的回复表
?
这里做查看帖子详细内容时候我是这样做的:
?
1.我是根据tz_id把这个帖子类Tz session.get()出来的。
2.然后显示本帖的详细内容:tz.getTitle()......tz.getContent()....
3.然后我就得到了本帖的所有回帖的Set ? ?tz.getReps();
我现在想分页,但是用hibernate的分页我查的时候就没有分页查询而且我不想从多端再查。。。怎么办里。。干脆自己写个吧。(效率不高,仅供交流)
?
我的基本思想是:如果你想分页,直接把你查询的list传过来,在把你想每页显示几条pageSize传进来 这个分页类计算总页数 里面的getInfoByCurrentPage方法根据前台传入的page(当前页)得到当前页应该的list段放入scope:request里传到view层。在显示。
?
Fenye.java
?
package com.svse.utils; import java.util.ArrayList; import java.util.List; public class Fenye { public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List getList() { return list; } public void setList(List list) { this.list = list; } /* * @param totalCount集合总记录数 * @param totalPage要显示的总页数 * @param pageSize每页显示几条 */ private int totalCount=0; private int totalPage=0; private int pageSize=0; private List list=new ArrayList(); /* * @list 集合 * @pageSize 每页显示几条 */ public Fenye(List list,int pageSize) { this.totalCount=list.size(); this.totalPage=(totalCount+pageSize-1)/pageSize; this.list=list; this.pageSize=pageSize; } /* * 根据页码得到当前页的信息段 等于是吧list根据需要有几页分成几段 */ public List getInfoByCurrentPage(int currentPage) { List currentPageInfo=new ArrayList(); if(list.size()!=0 &&list.size()>pageSize) { for(int i=(currentPage*pageSize-pageSize);i<=(currentPage*pageSize-1);i++) { if(i>(this.list.size()-1)) continue; currentPageInfo.add(list.get(i)); } return currentPageInfo; } else return list; } }
?
?
?
页是分出来了。
其中遇到一个问题:因为我从帖子(Tz)端查回复端(Rep)得到的是Set集合。我把Set用list.addAll()转成list后记录顺序是不断变化的 每次刷新都不一样。
因此要把转换后的list先按id倒序排列 相当于最新的回复放在最前---要用到比较接口Comparator下面有说明
?
CompareRep.java
?
package com.svse.utils; import java.util.Comparator; import com.svse.entity.Rep; /** * 回复比较类 * @author wokong * */ public class CompareRep implements Comparator { public int compare(Object arg0, Object arg1) { Rep rep1=(Rep)arg0; Rep rep2=(Rep)arg1; if(rep1.getRep_id()>rep2.getRep_id()) return 0; else return 1; } }
?
?
?
?
然后在Fenye fenye = new Fenye(排序后的list, 每页显示几条数据);
?
具体在Servlet中的分页操作 排序哪个实体就只用写一个比较类可以了
?
//分页操作 List arrList = new ArrayList(); arrList.addAll(arr);//把Set转换为List CompareTz sort=new CompareTz();//实例化比较类 Collections.sort(arrList,sort);//把比较类排序 Fenye fenye = new Fenye(arrList, 5);//实例化分页类,每页显示5条 if(request.getParameter("page")==null) currentPage=1; else if(Integer.parseInt(request.getParameter("page"))<=0) currentPage=1; else if(Integer.parseInt(request.getParameter("page"))>fenye.getTotalPage()) currentPage=fenye.getTotalPage(); else currentPage=Integer.parseInt(request.getParameter("page")); List currenInfo = fenye.getInfoByCurrentPage(currentPage);//得到相应页的list request.setAttribute("pageList", currenInfo); request.setAttribute("totalPage",fenye.getTotalPage()); request.setAttribute("cu