做本人用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("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
- 大小: 24.2 KB
- 大小: 5.4 KB
分享到:
相关推荐
一个通用的数据库分页类
分页查询是Oracle数据库比较重要的一个知识点!希望这个对你有参照作用。
Oracle通用数据库存储过程代码--高效分页存储过程,只需简单的修改即可使用,方便易懂!
PHP通用的数据库分页类 欢迎下载学习 欢迎下载学习
JAVA,JSP,实现各类数据库分页实现大全。通用数据分页实现设计。
C#版Oracle数据库通用操作类,包含了基础连接、执行基础语句、返回参数执行、dataset分页执行等简单oracle命令执行及哈稀表自动插入数据库等高级任务执行等。
用三种方法在数据库中进行分页,只需传入相关参数(表名,页大小,页索引等)就可以进行获得相应页的数据
SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。
oracle数据库的查询分页加条件和排序的通用型存储过程,通过将表名以参数的形式传入到存储过程中做到多表通用,也可以是多表关联的sql语句 将其看作一个表也能调用该存储过程,分页只需要传与页数,和每页显示的行数...
Oracle数据库通用的分页存储过程,含存储过程源码,分页的小例子,供大家参考!
SQL数据库分页代码,是通用代码,可做少量修改以匹配你所需要的数据库
数据库级别异步分页 javascript 通用分页存储过程 Sqlserver2005
超级强悍的java web通用分页组件,只要简单的一条sql语句就可以轻松的实现分页,目前对oracle,SQL Server2005,SQL server200,mysql都做了实现,程序通过接口来封装,你可以实现对其他数据库的分页。里面有调用例子...
NULL 博文链接:https://hzs0502030128.iteye.com/blog/2254585
有些是对内容的分页,比如把一篇长达上万字的内容进行分页,这样如果把SQL写到类里面的,就更要不得了,一点用也没有。 BluePage是一个通用的分页类,它能帮助你更快地完成分页任务。 先看使用例子: ...
里面包含了高性能的jdbc数据库操作方法,使用非常方便、灵活、通用,还有很好的连接池,数据库操作可以直接使用。 里面还包含分页的示例和数据库,分页代码简单、实用、使用非常方便、灵活学。 希望能对大家...
通用高效分页存储过程实现,欢迎高手指点 含数据库脚本,经测试通过
内有Pager 和 Dao类。Pager类用于分页。Dao类用于数据库数据查询,调用setConn根据自己的DBHelper获得数据库连接,适用于大部分数据库链接查询。
通用的TERADATA、ORACLE数据库分页SQL, 包含在JAVA代码中,其中的Service实现不包含在里面,需要自己实现。