分页技术

株洲北大青鸟作者:凌智

分页查询功能一直是web编程中常用的技术,如何实现可重复使用
而又简单的分页技术呢,下面的代码可以提供一些参考,实现用户列表
的分页显示,当其它数据需分页显示时,可以复用其中的分页对象
(SplitPage.java),然后提供实现dao接口的类.
先列出这个例子中的接口类和页面文件清单:
1.数据库连接对象:DBConnection,获取数据连接对象getConnection();
2.分页(类)对象:SplitPage.java,提供页面参数(是否首页/尾页/
当前第n页等)
3.数据库访问接口:dao,提供业务逻辑中对数据库操作接口,
用于分页查寻的接口方法是:
findAll(SplitPage sp)//方法的输入参数为分页对象
getRows()//提供总的记录数
UserDao.java用于实现这个接口.

4.用户JavaBean:User.java,分页显示用户列表时的用户对象.
https://www.360docs.net/doc/4d2404679.html,erList.jsp:分页显示用户列表jsp页面.

============================================================
下面就给出详细介绍:
------------------------------------------------------------
1.关于数据库连接对象,实现下面的方法,为dao提供Connection对象
//获得数据库连接
public Connection getConnection(){
Connection conn=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库连接
public void close(ResultSet rs,Statement st,Connection conn){
try {
if(rs!=null) rs.close();
if(st!=null) st.close();
if(conn!=null){
if(!conn.isClosed()){
conn.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

------------------------------------------------------------
2.分页对象的实现:
public class SplitPage {
//分页请求时,请求标识参数
final public static String FIRSTPAGE="first";//请求第一页
final public static String PREVIOUSEPAGE="previous";//请求上一页
final public static String NEXTPAGE="next";//请求下一页
final public static String LASTPAGE="last";//请求最后一页

private int pageRows=3;//每页显示记录数,默认3条,可以在页面设置
private int totalRows=0;//总的记录数,这个参数由数据库dao对象提供
private int currentPage=1;//当前显示的页面编号,默认第一页
private int firstPage=1;//首页位置,默认第一页
private int totalPages=1;//总的页面数量,默

认就一页


public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

public int getFirstPage() {
return firstPage;
}
public void setFirstPage(int firstPage) {
this.firstPage = firstPage;
}

public int getPageRows() {
return pageRows;
}
public void setPageRows(int pageRows) {
if(pageRows==0)throw new ArithmeticException();
this.pageRows = pageRows;//如果pageRows被设置为零,应当抛出异常.
//修改每页显示记录数,将会直接影响总页面数,所以要同时修改
this.totalPages=(this.totalRows%this.pageRows==0)?this.totalRows/this.pageRows:this.totalRows/this.pageRows+1;
}
public int getTotalRows() {
return totalRows;
}
//设置分页对象的总记录属性后,就应该根据每页面显示记录数,计算得到总的页面数
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
//计算总的页面数(或最后的页面号),两个整数相除如果刚好除尽,值就是相除后的商,否则如果有余数,商应当还加1.
this.totalPages=(this.totalRows%this.pageRows==0)?this.totalRows/this.pageRows:this.totalRows/this.pageRows+1;
}
//不应该提供方法设置总页面数,它是计算得到的
//但应当提供获取总页面数的方法.
public int getTotalPages() {
return totalPages;
}

//根据请求页面的标识参数,重新计算当前要显示的页面
//核心方法,实现分页显示功能.
public int confirmPage(String flag){
int newPage=this.currentPage;
if(flag!=null){//flag只可能是下面值之一
if(flag.equals(SplitPage.FIRSTPAGE)){
newPage=1;
}else if(flag.equals(https://www.360docs.net/doc/4d2404679.html,STPAGE)){
newPage=this.totalPages;
}else if(flag.equals(SplitPage.NEXTPAGE)){
//页面总数和当前页面编号相等吗,如果是那么页面编号不往后走,否则页面编号加一
newPage=(this.totalPages==this.currentPage)?this.currentPage:this.currentPage+1;
}else if(flag.equals(SplitPage.PREVIOUSEPAGE)){
//第一个页面和当前页面相等吗,如果是那么页面编号不往前走,否则页面编号减一
newPage=(this.firstPage==this.currentPage)?this.currentPage:this.currentPage-1;
}else{//否则是一个数字字符串
int tpage=Integer.parseInt(flag

.trim());
newPage=tpage;
}
}else{//如果请求标识参数为空,那么当前页码不变
newPage=this.currentPage;
}
//在返回前设置当前页面
this.setCurrentPage(newPage);
return newPage;
}
}

------------------------------------------------------------
3.在UserDao.java中实现接口方法findAll(SplitPage sp)
提供数据集合的分页列表.只要实现了这个方法,总是可以正确提供
分页显示数据.
//分页查询
public List findAll(SplitPage sp) {
List list = new ArrayList();
//获取数据库连接对象
Connection conn = factory.getConnection();
Statement st = null;
ResultSet rs = null;
//在sqlserver数据中分页查询的sql语句,分页的参数来自
//入参SplitPage对象.
String sql = "select top "+sp.getPageRows()+" * from users2 where id " +
" not in(select top ("+sp.getPageRows()*(sp.getCurrentPage()-1)+") id " +" from users2 order by id) order by id";
try {
st = conn.createStatement();
rs = st.executeQuery(sql);
while (rs.next()) {
User user = new User();
user.setId(rs.getInt(1));
user.setUserName(rs.getString(2));
user.setPassWord(rs.getString(3));
user.setBirthday(rs.getString(4));
user.setSex(rs.getString(5));
user.setEmail(rs.getString(6));
user.setMarried(rs.getString(7));
user.setInterest(rs.getString(8));
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
factory.close(rs, st, conn);
}
return list;
}
------------------------------------------------------------
4.剩下的工作就是在jsp中分页显示用户列表了,凡是需要分页浏览
显示的数据都可以通过dao和SplitPage对象实现了.



My JSP 'userList.jsp' starting page
//这段代码实现在分页中
//切换到分页范围内的任何一个页面


<%--
spage 是分页对象,保存

分页的详细信息,此对象存放在session中
每次查询或显示分页数据时只要设置此对象的当前页就可.
--%>


<%
//翻页时的方向值,即SplitPage中请求标识参数
String flag=request.getParameter("flag");
//每次刷新页面时都应当重新获得表中的记录数,
//因为翻页过程中表的记录可能随时都会更新
int totalRows=dao.getRows();//总的记录数
spage.setTotalRows(totalRows);
//重新计算确定当前要显示的页面值,这是一次必要的调用,
//实现了翻页
int currentPage=spage.confirmPage(flag);
//spage.setPageRows(10);修改每页显示的记录数,默认3
%>


查看用户列表,用户管理









<%
//翻页查询时需要传递翻页对象,翻页对象保存在session中
List list=dao.findAll(spage);
for(User u:list){
%>







<%} %>



编号用户名出生日期爱好操作
<%=u.getId() %><%=u.getUserName() %><%=u.getBirthday() %><%=u.getInterest() %>修改  删除

<%--下面页面分页操作,其它数据分页页面复用时拷贝这段
代码就可以了.
--%>

首页 
上一页 
下一页 
最后页 



























jsp分页代码(jsp+JavaBean)(2009-09-13 19:19:51)
转载标签: jsp分页javabeanit 分类: jsp
ShowRecordByPage.java
package database.operation;
import java.sql.*;
import com.sun.rowset.*;
public class ShowRecordByPage
{ int pageSize=10; //每页显示的记录数
int pageAllCount=0; //分页后的总页数
int showPage=1 ; //当前显示页
StringBuffer presentPageResult; //显示当前页内容
CachedRowSetImpl rowSet; //用于存储ResultSet对象
String databaseName=""; //数据库名称
String tableName=""; //表的名字
String user="" ; //用户
String password="" ; //密码
String 字段[]=new String[100] ;
int 字段个数=0;
public ShowRecordByPage()
{ presentPageResult=new StringBuffer();
try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
}
catch(Exception e){}
}
public void setPageSize(int size)
{ pageSize=size;
字段个数=0;
String uri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName="+databaseName;
try{ Connection con=DriverManager.getConnection(uri,user,password);
DatabaseMetaData metadata=con.getMetaData();
ResultSet rs1=metadata.getColumns(null,null,tableName,null);
int k=0;
while(rs1.next())
{ 字段个数++;
字段[k]=rs1.getString(4); //获取字段的名字
k++;
}
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs=sql.executeQuery("SELECT * FROM "+tableName);
rowSet=new CachedRowSetImpl(); //创建行集对象
rowSet.populate(rs);
con.close(); //关闭连接
https://www.360docs.net/doc/4d2404679.html,st();
int m=rowSet.getRow(); //总行数
int n=pageSize;
pageAllCount=((m%n)==0)?(m/n):(m/n+1);
}
catch(Exception exp){}
}
public int getPageSize()
{ return pageSize;
}
public int getPageAllCount()
{ return pageAllCount;
}
public void setShowPage(int n)
{ showPage=n;
}
public int getShowPage()
{ return showPage;
}
public StringBuffer getPresentPageResult()
{ if(showPage>pageAllCount)
showPage=1;
if(showPage<=0)
showPage=pageAllCount;
presentPageResult=show(showPage);
return presentPageResult;
}
public StringBuffer show(int page)
{ StringBu

ffer str=new StringBuffer();
str.append("

");
str.append("");
for(int i=0;i<字段个数;i++)
{ str.append("");
}
str.append("");
try{ rowSet.absolute((page-1)*pageSize+1);
for(int i=1;i<=pageSize;i++)
{ str.append("");
for(int k=1;k<=字段个数;k++)
{ str.append("");
}
str.append("");
rowSet.next();
}
}
catch(SQLException exp){}
str.append("
"+字段[i]+"
"+rowSet.getString(k)+"
");
return str;
}
public void setDatabaseName(String s)
{ databaseName=s.trim();
}
public String getDatabaseName()
{ return databaseName;
}
public void setTableName(String s)
{ tableName=s.trim();
}
public String getTableName()
{ return tableName;
}
public void setPassword(String s)
{ password=s.trim();;
}
public void setUser(String s)
{ user=s.trim();
}
public String getUser()
{ return user;
}
}

showByPage.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<%@ page import="database.operation.*" %>







数据库

表的记录将被分页显示。

共有 页.

每页最多显示条记录。



当前显示第 页,

单击“前一页”或“下一页”按纽查看记录





<

/Table>



相关文档
最新文档









输入页码: