我们使用一个beans来实现数据库的记录的分页显示,方法有很多种。本例是以ResultSet类的游标来实现分页的。
本例由:分页显示记录的页面Jsp
分页beans
数据库连接beans组成
本例在Tomcat下测试通过。
关键思想:
假设总记录数为m,每页显示的记录数是n,那么总页数的计算公式是:
总页数=(m%n)==0?(m/n):(m/n+1);
如果准备显示第p页的内容,应当把游标移动到第(p-1)*n+1条记录处。
源代码如下:
1、分页beans
pageNumber.java
package bean;
public class PageNumber
{
int rowCount=1, //总的记录数
pageSize=1, //每页显示的记录数
showPage=1, //设置预显示的页码数
pageCount=1; //分页之后的总页数
public void setRowCount(int n){
rowCount=n;
}
public int getRowCount(){
return rowCount;
}
public void setPageCount(int r,int p){
rowCount=r;
pageSize=p;
pageCount=(rowCount%pageSize)==0?(rowCount/pageSize):(rowCount/pageSize+1);
//计算分页之后的总页数
}
public int getPageCount(){
return pageCount;
}
public void setShowPage(int n){
showPage=n;
}
public int getShowPage(){
return showPage;
}
public void setPageSize(int n){
pageSize=n;
}
public int getPageSize(){
return pageSize;
}
}
2、数据库连接beans
package bean;
import java.sql.*;
import java.io.*;
public class MyConnection{
Connection con=null; //声明一个共享的连接对象
Statement stat=null;
ResultSet rs=null;
int rowCount=0; //总的记录数
public MyConnection(){
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
}catch(ClassNotFoundException e){
System.out.print(e);
}
try{
con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;
DatabaseName=student;","sa","");
}catch(SQLException e){
System.out.print(e);
}
}
public ResultSet myQuery(String sql) throws SQLException{
//结果集的游标可上下移动,但当数据库变化时,结果集不变,
//不能用结果集更新数据库中的表
stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//返回可滚动的结果集
rs=stat.executeQuery(sql);
return rs;
}
public void myClose() throws SQLException{
con.close();
}
}
3、分页显示记录的JSP页面
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.sql.*"%>
<%@page import="bean.PageNumber"%>
<%@page import="bean.MyConnection"%>
<%@page import="java.io.*"%>
<jsp:useBean id="handlePage" class="bean.PageNumber" scope="session"/>
<jsp:useBean id="myCon" class="bean.MyConnection" scope="application"/>
<HTML>
<BODY bgcolor=cyan><Size=1>
<CENTER>
<BR><BR>
<%!
// 以表格形式显示数据库记录的方法
public void showList(ResultSet rs,JspWriter out,int n){
try{
out.print("<BR><BR><Table border=2><tr><th>学号<th>姓名<th>数学<th>英语<th>物理</tr>");
for(int i=1;i<=n;i++){
out.print("<tr>");
String number=rs.getString(1);
out.print("<td>"+number+"</td>");
String name=rs.getString(2);
out.print("<td>"+name+"</td>");
int math=rs.getInt(3);
out.print("<td>"+math+"</td>");
int english=rs.getInt(4);
out.print("<td>"+english+"</td>");
int physics=rs.getInt(5);
out.print("<td>"+physics+"</td>");
out.print("</tr>");
rs.next();
}
out.print("</table>");
}catch(Exception e){
System.out.println(e);
}
}
%>
<%
ResultSet rs=null;
int rowCount=0; //总的记录数
try{
//返回可滚动的结果集
rs=myCon.myQuery("select * from students");
//将游标移动到最后一行
rs.last();
//获取记录总数
rowCount=rs.getRow();
//设置每页显示的记录数
handlePage.setPageSize(2);
//计算总页数
handlePage.setPageCount(rowCount,handlePage.getPageSize());
out.print("共有"+handlePage.getPageCount()+"页,");
out.print("每页显示"+handlePage.getPageSize()+"条记录");
}catch(SQLException e){
out.print(e);
}
%>
<%--选择显示某页的表单--%>
<%String str=response.encodeRedirectURL("showList.jsp"); //获取showList.jsp的url%>
<Form action="<%=str%>" method="post">
显示首页:<Input Type="hidden" name="a" value="first">
<input type=submit value="first">
</form>
<Form action="<%=str%>" method="post">
显示下一页:<Input Type="hidden" name="a" value="next">
<input type=submit value="next">
</form>
<Form action="<%=str%>" method="post">
显示上一页:<Input Type="hidden" name="a" value="previous">
<input type=submit value="previous">
</form>
<Form action="<%=str%>" method="post">
输入要显示的页数:<Input Type="text" name="a" value="1" style="text-align:right">
<input type=submit value="submit">
</form>
<%
String s=request.getParameter("a");
if(s==null){
s="1";
}else if(s.equals("first")){
handlePage.setShowPage(1); //设置预显示页
out.print("目前显示第"+handlePage.getShowPage()+"页");
//将游标移到指定的位置
rs.absolute(1);
//显示该页的内容
showList(rs,out,handlePage.getPageSize());
}else if(s.equals("next")){
int n=handlePage.getShowPage(); //获取目前的页数
n=(n+1); //将页数增1
if(n>handlePage.getPageCount()) n=1;
handlePage.setShowPage(n); //设置预显示页
out.print("目前显示第"+handlePage.getShowPage()+"页");
//将游标移到指定的位置
rs.absolute((n-1)*handlePage.getPageSize()+1);
//显示该页的内容
showList(rs,out,handlePage.getPageSize());
}else if(s.equals("previous")){
int n=handlePage.getShowPage(); //获取目前的页数
n=n-1; //将页数减1
if(n<=0) n=handlePage.getPageCount();
handlePage.setShowPage(n); //设置预显示页
out.print("目前显示第"+handlePage.getShowPage()+"页");
//将游标移到指定的位置
rs.absolute((n-1)*handlePage.getPageSize()+1);
//显示该页的内容
showList(rs,out,handlePage.getPageSize());
}else{
int m=Integer.parseInt(s); //把输入的字符转化为整型数
handlePage.setShowPage(m); //设置预显示页
out.print("目前显示第"+handlePage.getShowPage()+"页");
int n=handlePage.getShowPage();
//将游标移到指定的位置
rs.absolute((n-1)*handlePage.getPageSize()+1);
//显示该页的内容
showList(rs,out,handlePage.getPageSize());
}
%>
</CENTER>
</BODY>
</HTML>
数据库的表结构是:
create table students(
id varchar(10),name varchar(10),math int,english int,physics int)
数据库名是:student
注意:本例连接Sql数据库方式是直连,需要三个Sql的直连包。