一、可滚动结果集

 

Connection con  = DriverManager.getConnection();

PreparedStatement stmt = con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery();

常用方法:

(1)rs.absolute(n);        可以将指针跳到第n行。

(2)rs.relative(n);           可以将指针相对向下或向上n行。

(3)rs.first();

(4)rs.last();

(5)int curRow = rs.getRow();    指针指向的当前行

 

二、功能实现分解

 思路是,如果要显示那个页面,就要先算出来每个页面第一条记录是所有记录中的第几条记录,假设每页的第一条记录是总记录中的第position条记录,那么position=(ShowPage - 1)×PageSize+1。比如上图这个例子,如果要显示第一页,就要计算出第一页中的第一条记录是总的记录中的第一条记录;如果要显示第二页,就要计算出第二页中的第一条记录是总的记录中的第四条记录;如果要显示第三页,就要计算出第一页中的第一条记录是总的记录中的第九条记录。

1.计算结果的个数

 

rs.last();

int size = rs.getRow();

即可得到结果的个数。

2.得到需要分几页

 

如果一页能够放5条记录,则

int pageCount = (size%5==0)?(size/5):(size/5+1);

即可获得需要分几页。

3.控制一页中规定显示记录个数

 

如果一页能显示5条记录,可以通过使用count进行计数。

int count = 0;

do{

if(count>=5) break;

.....

count++;

}while(rs.next());

通过break语句,能够使其显示到超过规定条目就跳出。

4.如何知道当前是第几页

 

通过HTTP get的特点,在地址栏中标明当前地址,如http://.......?curPage=1    表示现在是第一页。

String tmp = request.getParameter("curPage");
if(tmp==null){
       tmp="1";
}
curPage = Integer.parseInt(tmp);

可以获得当前页。

注意:

rs.absolute(1);表示指向第一条记录;

不存在rs.absolute(0);

rs.absolute((curPage-1)*PAGESIZE+1);      把结果集指针调整到当前页应该显示的记录的开始.

比如如果一页显示5条记录,当前页是第二页,则需要把指针调整到6,当前页是第三页,则需要把指针调整为11.

5.点击首页、上一页、下一页、尾页的行为

 

<a href="multipage.jsp?curPage=<%curPage+1%>" >下一页</a>

<a href="multipage.jsp?curPage=<%curPage-1%>" >上一页</a>

<a href="multipage.jsp?curPage=<%pageCount%>" >尾页</a>

<a href="multipage.jsp?curPage=1" >首页</a>

6.为了保存当前页位置,则需要把当前页位置设为全局变量。

 
综合代码:
  1. <%@ page contentType="text/html" pageEncoding="GB2312" language="java"%>
  2. <%@ page import="java.sql.*"%>
  3. <html>
  4. <head>
  5. <title>hello</title>
  6. </head>
  7. <body>
  8. <table border="1" spacing="2">
  9. <%!
  10. public static final String DRIVER = "com.mysql.jdbc.Driver";
  11. public static final String USER = "root";
  12. public static final String PASS = "12345";
  13. public static final String URL = "jdbc:mysql://localhost:3306/MLDN";
  14. public static final int PAGESIZE = 5;
  15. int pageCount;
  16. int curPage = 1;
  17. %>
  18. <%
  19. //一页放5个
  20. String user = null;
  21. String pass = null;
  22. try{
  23. Class.forName(DRIVER);
  24. Connection con = DriverManager.getConnection(URL,USER,PASS);
  25. String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp";
  26. PreparedStatement stat = con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
  27. ResultSet rs = stat.executeQuery();
  28. rs.last();
  29. int size = rs.getRow();
  30. pageCount = (size%PAGESIZE==0)?(size/PAGESIZE):(size/PAGESIZE+1);
  31. String tmp = request.getParameter("curPage");
  32. if(tmp==null){
  33. tmp="1";
  34. }
  35. curPage = Integer.parseInt(tmp);
  36. if(curPage>=pageCount) curPage = pageCount;
  37. boolean flag = rs.absolute((curPage-1)*PAGESIZE+1);
  38. out.println(curPage);
  39. int count = 0;
  40. do{
  41. if(count>=PAGESIZE)break;
  42. int empno = rs.getInt(1);
  43. String ename = rs.getString(2);
  44. String job = rs.getString(3);
  45. Date hiredate = rs.getDate(4);
  46. float sal = rs.getFloat(5);
  47. int comm = rs.getInt(6);
  48. count++;
  49. %>
  50. <tr>
  51. <td><%=empno%></td>
  52. <td><%=ename%></td>
  53. <td><%=job%></td>
  54. <td><%=hiredate%></td>
  55. <td><%=sal%></td>
  56. <td><%=comm%></td>
  57. </tr>
  58. <%
  59. }while(rs.next());
  60. con.close();
  61. }
  62. catch(Exception e){
  63. }
  64. %>
  65. </table>
  66. <a href = "multipage.jsp?curPage=1" >首页</a>
  67. <a href = "multipage.jsp?curPage=<%=curPage-1%>" >上一页</a>
  68. <a href = "multipage.jsp?curPage=<%=curPage+1%>" >下一页</a>
  69. <a href = "multipage.jsp?curPage=<%=pageCount%>" >尾页</a>
  70. 第<%=curPage%>页/共<%=pageCount%>页
  71. </body>
  72. </html>

思路是,如果要显示那个页面,就要先算出来每个页面第一条记录是所有记录中的第几条记录,假设每页的第一条记录是总记录中的第position条记录,那么position=(ShowPage - 1)×PageSize+1。比如上图这个例子,如果要显示第一页,就要计算出第一页中的第一条记录是总的记录中的第一条记录;如果要显示第二页,就要计算出第二页中的第一条记录是总的记录中的第四条记录;如果要显示第三页,就要计算出第一页中的第一条记录是总的记录中的第九条记录。
      
在JSP中的核心代码为如下(用的数据库为MySQL):

复制代码
代码如下:
<%!  int pageSize=4;
 int
pageCount;
 int showPage;
 %>

<!--
连接数据库并从数据库中调取记录-->
<%
 Connection con;
 Statement
sql;
 ResultSet rs;

try{Class.forName("com.mysql.jdbc.Driver");

 }catch(ClassNotFoundException
e){
 }

try{con=DriverManager.getConnection("jdbc:mysql://localhost:3306/message
board","root","123456");
  sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
  //返回可滚动的结果集

  rs=sql.executeQuery("select * from messageinfo");
  //将游标移到最后一行

  rs.last();
  //获取最后一行的行号
  int
recordCount=rs.getRow();
  //计算分页后的总数

  pageCount=(recordCount%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1);

//获取用户想要显示的页数:
  String
integer=request.getParameter("showPage");
  if(integer==null){
   integer="1";
  }
  try{showPage=Integer.parseInt(integer);
  }catch(NumberFormatException
e){
   showPage=1;
  }
  if(showPage<=1){
   showPage=1;
  }
  if(showPage>=pageCount){
   showPage=pageCount;
  }

//如果要显示第showPage页,那么游标应该移动到的position的值是:
  int
position=(showPage-1)*pageSize+1;
  //设置游标的位置
  rs.absolute(position);
  //用for循环显示本页中应显示的的记录
  for(int
i=1;i<=pageSize;i++){  
 %>
   <table>
    <tr>

     <th><%=rs.getString("UserName")
%></th>
     <td>发表于:<%=rs.getString("datetime")
%></td>
    </tr>
    <tr >
     <th
colspan="3"><textarea><%=rs.getString("content")
%></textarea></th>
    </tr>
   </table>

<%  
   rs.next();
  } 
  rs.close();
  con.close();
  }
  catch(Exception
e){
  e.printStackTrace();}
 %>
 <br>
 第<%=showPage
%>页(共<%=pageCount %>页)
 <br>
 <a
href="ShowMessages.jsp?showPage=1">首页</a>
 <a
href="ShowMessages.jsp?showPage=<%=showPage-1%>">上一页</a>
<% //根据pageCount的值显示每一页的数字并附加上相应的超链接
  for(int
i=1;i<=pageCount;i++){
 %>
   <a
href="ShowMessages.jsp?showPage=<%=i%>"><%=i%></a>
<% }
 %> 
 <a
href="ShowMessages.jsp?showPage=<%=showPage+1%>">下一页</a>
 <a
href="ShowMessages.jsp?showPage=<%=pageCount%>">末页</a>
 <!--
通过表单提交用户想要显示的页数 -->
 <form action=""
method="get">
  跳转到第<input type="text" name="showPage"
size="4">页
  <input type="submit" name="submit"
value="跳转">
 </form> 

运行结果如下(为了简化代码,已经网页布局相关代码去掉,此处仅指功能):

JSP分页技术的实现(利用当前页进行前后加减,并利用href进行当前页面传值,传值当然是那个当前值变量)的更多相关文章

  1. jsp分页技术

    1.以下为分页类: import java.io.Serializable;  import java.util.List;    import org.apache.commons.lang.bui ...

  2. 眼下最好的JSP分页技术

     2005-08-24   来源:CSDN  作者:wanchao2001 前言     在使用数据库的过程中,不可避免的须要使用到分页的功能,但是JDBC的规范对此却没有非常好的解决.对于这个需求非 ...

  3. 关于Ajax无刷新分页技术的一些研究 c#

    关于Ajax无刷新分页技术的一些研究 c# 小弟新手,求大神有更好的解决方案,指教下~ 以前做项目,用过GridView的刷新分页,也用过EasyUI的封装好的分页技术,最近在老项目的基础上加新功能, ...

  4. jsp-------------之分页技术(一)

    jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 :  (算法) /* int pageS ...

  5. 利用JSP编程技术实现一个简单的购物车程序

    实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...

  6. 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)

    利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...

  7. 利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全)

    利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全) 14.5 利用JFreeChart生成区域图 通过JFreeChart插件只能生成普通效果的区域图,利用工厂类ChartFac ...

  8. 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)

    利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...

  9. 利用JFreeChart生成组合图表 (8) (转自 JSP开发技术大全)

    利用JFreeChart生成组合图表 (8) (转自 JSP开发技术大全) 14.8 利用JFreeChart生成组合图表  实例位置:光盘\mingrisoft\14\dxyy\02 通过JFree ...

随机推荐

  1. CentOS笔记-yum

    yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. yum [options] [command] [p ...

  2. Region Range

    三篇文章了解 TiDB 技术内幕 - 说存储| PingCAP https://pingcap.com/blog-cn/tidb-internal-1/ 对于一个 KV 系统,将数据分散在多台机器上有 ...

  3. Java,多个线程对同一个数据源的访问

    当多个线程对同一个数据源进行访问时,应对线程同步或加锁.为何?举个简单的例子:有一个共享的数据源dataSource,其值为0.有两个线程,Thread1和Thread2.Thread1的任务是将da ...

  4. Android IntentService的使用和源代码分析

    引言 Service服务是Android四大组件之中的一个,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用须要下载一个文件或者播放音乐等长期处于后台工作而有没有 ...

  5. EventStore文件存储设计

    背景 ENode是一个CQRS+Event Sourcing架构的开发框架,Event Sourcing需要持久化事件,事件可以持久化在DB,但是DB由于面向的是CRUD场景,是针对数据会不断修改或删 ...

  6. RK3399参考设计方案之DC-DC电源芯片RK808D【转】

    本文转载自:http://www.52rd.com/Blog/Detail_RD.Blog_sunnyqi_90673.html?WebShieldDRSessionVerify=Xv0bsGtD73 ...

  7. jsorder 第三方修改版 修正bug 增加总价

    我主要运用这个jsorder,修正了它的不足//1.0版本bug:刷新页面 无法增加或者删除原来添加的商品//1.1版本:修正了1.0版本  新增bug 能够修改原来的商品 但出现产品数量为0 仍然保 ...

  8. oracle:通过shell来运行rman命令

    每次都手工输入一批rman命令来进行备份等操作是很繁琐的事,有什么简便的方法吗?可以的,你可以把这批rman命令写在 shell命令里面,需要的时候,运行一下sh即可.下面是一个简单的实例: RMAN ...

  9. Python的多进程锁的使用

    很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱 这个时候,我们可以使用multiprocessing.Lock() 我一开始是这样使用的: import multip ...

  10. Java必知必会:异常机制详解

    一.Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的. 1.Throwable(可抛出):异常类的最终父类,它有两个子类,Error与 ...