一、可滚动结果集

 

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. WPF数据验证(5)―― 错误模板

    <Style TargetType="{x:Type TextBox}">            <Setter Property="Validatio ...

  2. LiberOJ#6178. 「美团 CodeM 初赛 Round B」景区路线规划 概率DP

    题意 游乐园被描述成一张 n 个点,m 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 i 个娱乐项目需要耗费 ci 分钟的时间,会让小 y 和妹子的开心度分别增加 h1i ,h2i ,他 ...

  3. 在Android Studio中修改应用包名

    紧凑模式下(包名中的每个字段紧贴在一起,例如),右键单击包名,Refactor -> Rename,只能修改包名最外层的字段 分离模式下(点击设置,将Hide Empty Middle Pack ...

  4. swift的String处理

    import UIKit import CoreText class ViewController: UIViewController { override func viewDidLoad() { ...

  5. 使用cwRsync在Windows的目录之间增量同步文件

    http://www.qiansw.com/using-cwrsync-in-the-windows-directory-between-the-incremental-synchronization ...

  6. extjs 4 checkboxgroup Panel的简单用法

    Ext.require([ 'Ext.tree.*', 'Ext.data.*', 'Ext.window.MessageBox', 'Ext.tip.*' ]); Ext.onReady(funct ...

  7. MapReduce ChainMapper/ChainReducer

    The ChainMapper class allows to use multiple Mapper classes within a single Map task.  The ChainRedu ...

  8. (linux)tasklet

      tasklet Tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联 例子: Void my_tasklet_func(unsigned long) DECLARE_TA ...

  9. Vue : props 使用细节(父组件传递数据给子组件)

    props使用细节 在Vue.js中我们可以使用 props 实现父组件传递数据给子组件,下面我们总结一下props的使用细节 1.基础类型检查 2.必填数据 3.默认值 4.自定义验证函数 其中每一 ...

  10. HDU - 1874 畅通工程续(最短路径)

    d.已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. s.最短路径 c.Dijkstra单源最短路 /* Dijkstra单源最短路 权值必须是非负 单源最短路径,Dijkstra算法 ...