首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

直接对数据库查询结果开展 分页 的通用类

2012-11-12 
直接对数据库查询结果进行 分页 的通用类?做本人用jsp+hibernate 设计了一个小的论坛,完全只是把基本的功

直接对数据库查询结果进行 分页 的通用类


?做本人用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;}elsereturn 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;elsereturn 1;}}

?

?

?

?

然后在Fenye fenye = new Fenye(排序后的list, 每页显示几条数据);

?

具体在Servlet中的分页操作 排序哪个实体就只用写一个比较类可以了

?

//分页操作List arrList = new ArrayList();arrList.addAll(arr);//把Set转换为ListCompareTz 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();elsecurrentPage=Integer.parseInt(request.getParameter("page"));List currenInfo = fenye.getInfoByCurrentPage(currentPage);//得到相应页的listrequest.setAttribute("pageList", currenInfo);request.setAttribute("totalPage",fenye.getTotalPage());request.setAttribute("currentPage",currentPage);request.setAttribute("fl_id",request.getParameter("fl_id"));forward="tzinfo/fyshow_tz.jsp";//跳转到jsp页面分页显示

?

?回复分页显示jsp页面

?

fyshow_tz.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%><%@page import="com.svse.entity.Tz"%><%@page import="com.svse.entity.Rep"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><body><%Tz tzInfo = (Tz) request.getAttribute("tzInfo");%>帖子信息<hr><br>帖子标题:<%=tzInfo.getTz_title()%><br>帖子内容:<%=tzInfo.getTz_content()%><br>发帖人:<%=tzInfo.getUser().getUserName()%><br>发帖时间:<%=tzInfo.getTz_pubtime()%><br><hr>回复信息<%Set reps = tzInfo.getReps();out.println("回复总数:"+reps.size());List currentRep=(List)request.getAttribute("currentRep");for(int i=0;i<currentRep.size();i++){Rep rep = (Rep)currentRep.get(i);out.print("<br>回复标题:"+rep.getRep_title());out.print("回复内容:"+rep.getRep_content());out.print("回复人:"+rep.getUser().getUserName());out.print("回复时间:"+rep.getRep_time()+"<br>");}%>共${totalPage}页 当前第${currentPage}页   <a href="Ser?object=tz&action=getTzInfo&page=1&tz_id=${tz_id }">首页</a> <a href="Ser?object=tz&action=getTzInfo&page=${totalPage}&tz_id=${tz_id }">尾页</a> <a href="Ser?object=tz&action=getTzInfo&page=${currentPage-1}&tz_id=${tz_id}">上一页</a> <a href="Ser?object=tz&action=getTzInfo&page=${currentPage+1}&tz_id=${tz_id}">下一页</a><hr>回复模块<form action="Ser?object=tz&action=tzRep&tz_id=<%=tzInfo.getTz_id()%>"method="post">回复标题:<input type="text" name="rep_title"><br>回复内容:<textarea rows="10" cols="20" name="rep_content"></textarea><br><input type="submit" value="回复" /></form></body></html>

?

具体运行效果:


直接对数据库查询结果开展 分页 的通用类
我是新人 希望大家多多指教

有什么建议早点告诉我啊学习。qq:6686496 邮箱:yuyifeifei@gmail.com.cn

?

热点排行