<%@pagelanguage="java"%><%@pageimport="java" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JSP分頁代碼

系統 1988 0
最近在做JSP的網頁,連接數據庫取數據時,用到了JSP的分頁實現,搜了一下網上的,供參考:

===================================================================================
TestPage.jsp

<%@ page contentType="text/html; charset=gb2312" %>
<%@ page language="java" %>
<%@ page import="java.sql.*" %>
<%
//驅動程序名,比較舊了,如果你用mysql5,自己改。
String driverName="org.gjt.mm.mysql.Driver";
String userName="root";//數據庫用戶名
String userPasswd="";//密碼

String dbName="bookstore";//數據庫名
String tableName="items"; //表名



//連接字符串
String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName(driverName).newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();

//每頁顯示記錄數
int PageSize = 8;
int StartRow = 0; //開始顯示記錄的編號
int PageNo=0;//需要顯示的頁數
int CounterStart=0;//每頁頁碼的初始值
int CounterEnd=0;//顯示頁碼的最大值
int RecordCount=0;//總記錄數;
int MaxPage=0;//總頁數
int PrevStart=0;//前一頁
int NextPage=0;//下一頁
int LastRec=0;
int LastStartRecord=0;//最后一頁開始顯示記錄的編號

//獲取需要顯示的頁數,由用戶提交
if(request.getParameter("PageNo")==null){ //如果為空,則表示第1頁
if(StartRow == 0){
???? PageNo = StartRow + 1; //設定為1
}
}else{
PageNo = Integer.parseInt(request.getParameter("PageNo")); //獲得用戶提交的頁數
StartRow = (PageNo - 1) * PageSize; //獲得開始顯示的記錄編號
}

//因為顯示頁碼的數量是動態變化的,假如總共有一百頁,則不可能同時顯示100個鏈接。而是根據當前的頁數顯示
//一定數量的頁面鏈接

//設置顯示頁碼的初始值!!
if(PageNo % PageSize == 0){
?? CounterStart = PageNo - (PageSize - 1);
}else{
?? CounterStart = PageNo - (PageNo % PageSize) + 1;
}

CounterEnd = CounterStart + (PageSize - 1);
%>

<html>
<head>
<title>分頁顯示記錄</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<%

//獲取總記錄數
ResultSet rs = statement.executeQuery("select count(*) from items" );
rs.next();
RecordCount = rs.getInt(1);

rs = statement.executeQuery("SELECT image_url,author,price,item_id FROM items ORDER BY item_id DESC LIMIT "
?????? +StartRow+", "+PageSize);

//獲取總頁數
MaxPage = RecordCount % PageSize;
if(RecordCount % PageSize == 0){
MaxPage = RecordCount / PageSize;
}else{
?? MaxPage = RecordCount/PageSize+1;
}
%>
<body class="UsePageBg">
<table width="100%" border="0" class="InternalHeader">
<tr>
?? <td width="24%"><font size=4>分頁顯示記錄</font></td>
??? <td width="76%">
?????? <font size=4><%="總共"+RecordCount+"條記錄 - 當前頁:"+PageNo+"/"+MaxPage %></font>
??? </td>
</tr>
</table>

<br>
<table width="100%" border="0" class="NormalTableTwo">
<tr>
??? <td class="InternalHeader">記錄序號</td>
??? <td class="InternalHeader" >圖像路徑</td>
??? <td class="InternalHeader" >作者</td>
??? <td class="InternalHeader" >價格</td>
??? <td class="InternalHeader" >圖書編號</td>
</tr>

<%
int i = 1;
while (rs.next()) {
int bil = i + (PageNo-1)*PageSize;
%>
<tr>
??? <td class="NormalFieldTwo" ><%=bil %></td>
??? <td class="NormalFieldTwo" ><%=rs.getString(1)%></td>
??? <td class="NormalFieldTwo" ><%=rs.getString(2)%></td>
??? <td class="NormalFieldTwo" ><%=rs.getString(3)%></td>
??? <td class="NormalFieldTwo" ><%=rs.getString(4)%></td>
</tr>
<%
i++;
}%>
</table>
><br>
<table width="100%" border="0" class="InternalHeader">
<tr>
?? <td><div align="center">
<%
?? out.print("<font size=4>");
//顯示第一頁或者前一頁的鏈接
//如果當前頁不是第1頁,則顯示第一頁和前一頁的鏈接
if(PageNo != 1){
??? PrevStart = PageNo - 1;
??? out.print("<a href=TestPage.jsp?PageNo=1>第一頁 </a>: ");
??? out.print("<a href=TestPage.jsp?PageNo="+PrevStart+">前一頁</a>");
}
out.print("[");

?? //打印需要顯示的頁碼
?? for(int c=CounterStart;c<=CounterEnd;c++){
?? if(c <MaxPage){
???? if(c == PageNo){
?????? if(c %PageSize == 0){
???????? out.print(c);
?????? }else{
????????? out.print(c+" ,");
?????? }
???? }else if(c % PageSize == 0){
??????? out.print("<a href=TestPage.jsp?PageNo="+c+">"+c+"</a>");
???? }else{
??????? out.print("<a href=TestPage.jsp?PageNo="+c+">"+c+"</a> ,");
???? }
?? }else{
???? if(PageNo == MaxPage){
????? out.print(c);
????? break;
???? }else{
??????? out.print("<a href=TestPage.jsp?PageNo="+c+">"+c+"</a>");
???? break;
?? }
}
}

out.print("]");;

if(PageNo < MaxPage){ //如果當前頁不是最后一頁,則顯示下一頁鏈接
??? NextPage = PageNo + 1;
??? out.print("<a href=TestPage.jsp?PageNo="+NextPage+">下一頁</a>");
}

//同時如果當前頁不是最后一頁,要顯示最后一頁的鏈接
if(PageNo < MaxPage){
?? LastRec = RecordCount % PageSize;
?? if(LastRec == 0){
????? LastStartRecord = RecordCount - PageSize;
?? }
?? else{
????? LastStartRecord = RecordCount - LastRec;
?? }

?? out.print(":");
??? out.print("<a href=TestPage.jsp?PageNo="+MaxPage+">最后一頁</a>");
}
out.print("</font>");
%>
</div>
</td>
</tr>
</table>
<%
rs.close();
statement.close();
?? connection.close();
%>
</body>
</html>

JSP分頁代碼
==================================================================================

jsp分頁顯示
http://www.cug.edu.cn/new/ReadNews.asp?NewsID=2009


<%@ page contentType="text/html;charset=gb2312" %>
<%@ page language="java" import="java.sql.*" %>

<script language="javascript">
function newwin(url) {
var

newwin=window.open(url,"newwin","toolbar=no,location=no,directories=no,status=no,

menubar=no,scrollbars=yes,resizable=yes,width=600,height=450");
newwin.focus();
return false;
}
</script>
<script LANGUAGE="javascript">
function submit10()
{
self.location.replace("fenye1.jsp")
}
</script>
<%//變量聲明
java.sql.Connection sqlCon; //數據庫連接對象
java.sql.Statement sqlStmt; //SQL語句對象
java.sql.ResultSet sqlRst; //結果集對象
java.lang.String strCon; //數據庫連接字符串
java.lang.String strSQL; //SQL語句
int intPageSize; //一頁顯示的記錄數
int intRowCount; //記錄總數
int intPageCount; //總頁數
int intPage; //待顯示頁碼
java.lang.String strPage;
int i;
//設置一頁顯示的記錄數
intPageSize = 4;
//取得待顯示頁碼
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據
intPage = 1;
}
else{//將字符串轉換成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//裝載JDBC驅動程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//設置數據庫連接字符串
strCon = "jdbc:odbc:heyang";
//連接數據庫
sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","");
//創建一個可以滾動的只讀的SQL語句對象
sqlStmt =

sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.Result

Set.CONCUR_READ_ONLY);//準備SQL語句
strSQL = "select user_id,user_name from userinfo order by user_id desc";
//執行SQL語句并獲取結果集
sqlRst = sqlStmt.executeQuery(strSQL);
//獲取記錄總數
sqlRst.last();//??光標在最后一行
intRowCount = sqlRst.getRow();//獲得當前行號
//記算總頁數
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//調整待顯示的頁碼
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>會員管理</title>
</head>
<body>
<form method="POST" action="fenye1.jsp">
第<%=intPage%>頁 共<%=intPageCount%>頁

<%if(intPage<intPageCount){%><a

href="fenye1.jsp?page=<%=intPage+1%>">下一頁

</a><%}%> <%if(intPage>1){%><a href="fenye1.jsp?page=<%=intPage-1%>">

上一頁</a><%}%>
轉到第:<input type="text" name="page" size="8"> 頁
<span><input class=buttonface type=′submit′ value=′GO′ name=′cndok′></span>
</form>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>ID</th>
<th>用戶名</th>
<th width=′8%′>刪除</th>
</tr>
<%
if(intPageCount>0){
//將記錄指針定位到待顯示頁的第一條記錄上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//顯示數據
i = 0;
String user_id,user_name;
while(i<intPageSize && !sqlRst.isAfterLast()){
user_id=sqlRst.getString(1);
user_name=sqlRst.getString(2);
%>
<tr>
<td><%=user_id%></td>
<td><%=user_name%></td>
<td width=′8%′ align=′center′><a href="delete.jsp?user_id=<%=user_id%>"

onClick="return newwin(this.href);">刪除</a></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>


</body>
</html>
<%
//關閉結果集
sqlRst.close();
//關閉SQL語句對象
sqlStmt.close();
//關閉數據庫
sqlCon.close();
%>

============================================================================

一個簡單的jsp分頁實現


環境
xp + jdk1.5 + tomcat5.5.23 + eclipse3.2.2 + myeclipse5.1.1GA + sqlserver2000

使用連接池方式連接數據庫,至于這方面的問題可參考 http://roamlog.cn/?p=39

寫一個DBConnection.java封裝對數據庫的一些操作,實現SqlTestDS的getConnection()方法連接數據庫

DBConnection.java

package database;

import java.sql.*;

public class DBConnection{

private Connection conn = null;

private Statement stmt = null;

ResultSet rs = null;

public ResultSet executeQuery(String sql) {
try {
conn =SqlTestDS.getConnection();
?? stmt=conn.createStatement
?? (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}

public void executeUpdate(String sql) {
try {
conn = SqlTestDS.getConnection();
stmt =conn.createStatement
?? (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}
}

public void closeStmt() {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public void closeConn() {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

一個jsp文件,負責分頁的處理

fenye.jsp

<%@ page contentType="text/html;charset=gbk"%>
<%@ page pageEncoding="gbk"%>
<%
request.setCharacterEncoding("gbk");
%>
<%@ page import="java.sql.*"%>
<%@ page import="database.DBConn"%>

<%
//變量聲明
ResultSet sqlRst; //結果集對象
String strCon; //數據庫連接字符串
String strSQL; //SQL語句
int intPageSize; //一頁顯示的記錄數
int intRowCount; //記錄總數
int intPageCount; //總頁數
int intPage; //待顯示頁碼
String strPage;
int i;
//設置一頁顯示的記錄數
intPageSize = 4;
//取得待顯示頁碼
strPage = request.getParameter("page");
if (strPage == null) {//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據
intPage = 1;
} else {//將字符串轉換成整型
intPage = Integer.parseInt(strPage);
if (intPage < 1)
intPage = 1;
}
strSQL = "select fkid,shjiaid from shop_shjiafk order by fkid desc";
//執行SQL語句并獲取結果集
DBConn dd = new DBConn();
sqlRst = dd.executeQuery(strSQL);
//獲取記錄總數
sqlRst.last();//光標在最后一行
intRowCount = sqlRst.getRow();//獲得當前行號
//記算總頁數
intPageCount = (intRowCount + intPageSize - 1) / intPageSize;
//調整待顯示的頁碼
if (intPage > intPageCount)
intPage = intPageCount;
%>
<html>
<head>
<script language="javascript">
function newwin(url) {
var newwin=window.open(url,"newwin","toolbar=no,location=no,directories=no,
status=no,menubar=no,scrollbars=yes,resizable=yes,width=600,height=450");
newwin.focus();
return false;
}
</script>
<script language="javascript">
function submit10()
{
self.location.replace("fenye.jsp")
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>會員管理</title>
</head>
<body>
<form method="post" action="fenye.jsp">

<%=intPage%>
頁 共
<%=intPageCount%>


<%
if (intPage < intPageCount) {
%>
<a href="fenye.jsp?page=<%=intPage + 1%>">下一頁 </a>
<%
}
%>
<%
if (intPage > 1) {
%>
<a href="fenye.jsp?page=<%=intPage - 1%>"> 上一頁</a>
<%
}
%>
轉到第:
<input type="text" name="page" size="8">

<span><input class=buttonface type="submit" value="go"
name="cndok"> </span>
</form>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>
ID
</th>
<th>
用戶名
</th>
<th width="8%">
刪除
</th>
</tr>
<%
if (intPageCount > 0) {
//將記錄指針定位到待顯示頁的第一條記錄上
sqlRst.absolute((intPage - 1) * intPageSize + 1);
//顯示數據
i = 0;
String user_id, user_name;
while (i < intPageSize && !sqlRst.isAfterLast()) {
user_id = sqlRst.getString(1);
user_name = sqlRst.getString(2);
%>
<tr>
<td>
<%=user_id%>
</td>
<td>
<%=user_name%>
</td>
<td width="8%" align="center">
<a href="delete.jsp?user_id=<%=user_id%>"
onClick="return newwin(this.href);">刪除</a>
</td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
</body>
</html>
<%
dd.closeStmt();
dd.closeConn();
%>
完成

========================================================================

//Author tar(bigangell@yesky.com)
//您可以任意拷貝復制該代碼,但請加上以上作者信息
//有任何問題請與我聯系
//效果請看 http://210.77.144.64/kk/java/java/article.jsp

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<jsp:useBean id="sqlconn" scope="page" class="kk.database.sqlconn" />
<%! String aTitle,aAuthor,AType,ArticleType,InsertTime,Color; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>ArticleList</TITLE>
<META NAME="Generator" CONTENT="jBuilder3.5 && jEdit1.0">
<META NAME="Author" CONTENT="bigangell">
<META NAME="Keywords" CONTENT="Java,Servlet,Jsp,Beans,PHP">
<META NAME="Description" CONTENT="A Pure World For Programming Include C/C++,Java">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<link rel="stylesheet" href="style.css">
</head>

<body bgcolor="#FFFFFF">
<table width="760" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<table width="750" border="0" cellspacing="2" cellpadding="2" align="center">
<tr align="center">
<td> </td>
</tr>
<tr>
<td>
<table width="740" border="0" cellspacing="1" cellpadding="1" align="center">
<tr align="center" bgcolor="#CCCCCC">
<td><b>標題</b></td>
<td><b>作者</b></td>
<td><b>類型</b></td>
<td><b>點擊</b></td>
<td><b>加入時間</b></td>
</tr>
<%
int i;
int ipage=10; //分頁單位
int allpage; //總頁數
int pages; //接受的頁碼變量
int cpage=1; //當前頁
int spage; //開始頁

//數據庫連接聲明
java.lang.String sql,pagesql;
java.sql.ResultSet rs,pagers;
pagesql = "select count(a_id) as A from article";

//取總文章數
pagers = sqlconn.executeQuery(pagesql);
int allCol = pagers.getInt("A");

//獲得總頁面數
allpage = (int)Math.ceil((allCol + ipage-1) / ipage);

//判斷參數pages是否為空
if (request.getParameter("pages")==null) {
pages=1;
} else {
pages = new Integer(request.getParameter("pages")).intValue();
}

//判斷當前頁
if(pages > allpage // pages == 0){
cpage = 1;
} else {
cpage = pages;
}

//判斷起始頁
spage=(cpage-1)*ipage;

sql = "select a_id,a_title,a_author,aID,a_time,a_readtime,sID from article order by a_id desc limit "+ spage +","+ ipage;
rs = sqlconn.executeQuery(sql);
int cu=1;

//循環取數據庫值
while (rs.next()) {
int aID = rs.getInt("a_id");
aTitle = rs.getString("a_title");
aAuthor = rs.getString("a_author");
int ArticleTypeID = rs.getInt("aID");
int ReadTime = rs.getInt("a_readtime");
InsertTime = rs.getString("a_time");
if (cu % 2 == 0) { Color="#DBECFD"; }
else { Color="#C6E1FD"; }
switch (ArticleTypeID) {
case(1):
ArticleType="小說";
break;
case(2):
ArticleType="散文";
break;
case(3):
ArticleType="詩歌";
break;
case(4):
ArticleType="隨筆";
break;
}
%>
<tr bgcolor="<%= Color %>">
<td width="300"><a href="viewarticle.jsp?aID=<%= aID %>"><%= aTitle %></a></td>
<td align="center" width="100"><%= aAuthor %></td>
<td align="center" width="50"><%= ArticleType %></td>
<td align="center" width="50"><%= ReadTime %></td>
<td align="center" width="240"><%= InsertTime %></td>
</tr>
<%
cu++;
}
%>
<tr bgcolor="#CCCCCC">
<td colspan="5" align="right" valign="middle">共 <%= allCol %>條記錄 共 <%= allpage %>頁 <% if (cpage>1) { %><a href="article.jsp?pages=<%= cpage-1 %>"><img src="images/prev.gif" border="0"></a><% } if (cpage<allpage) { %><a href="article.jsp?pages=<%= cpage+1 %>"><img src="images/next.gif" border="0"></a><% } %> / <% for (i=1;i<=allpage;i++) { if (i != pages) {%><a href="article.jsp?pages=<%= i %>"><%= i %></a> <% } }%></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

=================================================================================

http://www.newasp.net/tech/java/15477.html

前言
在使用數據庫的過程中,不可避免的需要使用到分頁的功能,可是JDBC的規范對此卻沒有很好的解決。對于這個需求很多朋友都有自己的解決方案,比如使用 Vector等集合類先保存取出的數據再分頁。但這種方法的可用性很差,與JDBC本身的接口完全不同,對不同類型的字段的支持也不好。這里提供了一種與 JDBC兼容性非常好的方案。
JDBC和分頁
Sun的JDBC規范的制定,有時很讓人哭笑不得,在JDBC1.0中,對于一個結果集(ResultSet)你甚至只能執行next()操作,而無法讓 其向后滾動,這就直接導致在只執行一次SQL查詢的情況下無法獲得結果集的大小。所以,如果你使用的是JDBC1.0的驅動,那么是幾乎無法實現分頁的。
好在Sun的JDBC2規范中很好的彌補了這一個不足,增加了結果集的前后滾動操作,雖然仍然不能直接支持分頁,但我們已經可以在這個基礎上寫出自己的可支持分頁的ResultSet了。



和具體數據庫相關的實現方法
有一些數據庫,如Mysql, Oracle等有自己的分頁方法,比如Mysql可以使用limit子句,Oracle可以使用ROWNUM來限制結果集的大小和起始位置。這里以Mysql為例,其典型代碼如下:
// 計算總的記錄條數
String SQL = "SELECT Count(*) AS total " + this.QueryPart;
rs = db.executeQuery(SQL);
if (rs.next())
Total = rs.getInt(1);
// 設置當前頁數和總頁數
TPages = (int)Math.ceil((double)this.Total/this.MaxLine);
CPages = (int)Math.floor((double)Offset/this.MaxLine+1);
// 根據條件判斷,取出所需記錄
if (Total > 0) {
SQL = Query + " LIMIT " + Offset + " , " + MaxLine;
rs = db.executeQuery(SQL);
}
return rs;
}
毫無疑問,這段代碼在數據庫是Mysql時將會是漂亮的,但是作為一個通用的類(事實上我后面要提供的就是一個通用類庫中的一部分),需要適應不同的數據庫,而基于這個類(庫)的應用,也可能使用不同的數據庫,所以,我們將不使用這種方法。


另一種繁瑣的實現方法
我看過一些人的做法(事實上包括我在內,一開始也是使用這種方法的),即不使用任何封裝,在需要分頁的地方,直接操作ResultSet滾到相應的位置,再讀取相應數量的記錄。其典型代碼如下:
<%
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,
java.sql.ResultSet.CONCUR_READ_ONLY);
strSQL = "select name,age from test";
//執行SQL語句并獲取結果集
sqlRst = sqlStmt.executeQuery(strSQL);
//獲取記錄總數
sqlRst.last();
intRowCount = sqlRst.getRow();
//記算總頁數
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//調整待顯示的頁碼
if(intPage>intPageCount) intPage = intPageCount;
%>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>姓名</th>
<th>年齡</th>
</tr>
<%
if(intPageCount>0){
//將記錄指針定位到待顯示頁的第一條記錄上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//顯示數據
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
很顯然,這種方法沒有考慮到代碼重用的問題,不僅代碼數量巨大,而且在代碼需要修改的情況下,將會無所適從。


使用Vector進行分頁
還見過另一些實現分頁的類,是先將所有記錄都select出來,然后將ResultSet中的數據都get出來,存入Vector等集合類中,再根據所需 分頁的大小,頁數,定位到相應的位置,讀取數據。或者先使用前面提到的兩種分頁方法,取得所需的頁面之后,再存入Vector中。
扔開代碼的效率不說,單是從程序結構和使用的方便性上講,就是很糟糕的。比如,這種做法支持的字段類型有限,int, double, String類型還比較好處理,如果碰到Blob, Text等類型,實現起來就很麻煩了。這是一種更不可取的方案。


一個新的Pageable接口及其實現
很顯然,看過上面三種實現方法后,我們對新的分頁機制有了一個目標,即:不與具體數據庫相關;盡可能做到代碼重用;盡可能與原JDBC接口的使用方法保持一致;盡可能高的效率。
首先,我們需要提供一個與java.sql.ResultSet向下兼容的接口,把它命名為Pageable,接口定義如下:
public interface Pageable extends java.sql.ResultSet{
/**返回總頁數
*/
int getPageCount();
/**返回當前頁的記錄條數
*/
int getPageRowsCount();
/**返回分頁大小
*/
int getPageSize();
/**轉到指定頁
*/
void gotoPage(int page) ;
/**設置分頁大小
*/
void setPageSize(int pageSize);
/**返回總記錄行數
*/
int getRowsCount();
/**
* 轉到當前頁的第一條記錄
* @exception java.sql.SQLException 異常說明。
*/
void pageFirst() throws java.sql.SQLException;
/**
* 轉到當前頁的最后一條記錄
* @exception java.sql.SQLException 異常說明。
*/
void pageLast() throws java.sql.SQLException;
/**返回當前頁號
*/
int getCurPage();
}
這是一個對java.sql.ResultSet進行了擴展的接口,主要是增加了對分頁的支持,如設置分頁大小,跳轉到某一頁,返回總頁數等等。
接著,我們需要實現這個接口,由于這個接口繼承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同,所以這里使用了一個簡單的Decorator模式。
PageableResultSet2的類聲明和成員聲明如下:
public class PageableResultSet2 implements Pageable {
protected java.sql.ResultSet rs=null;
protected int rowsCount;
protected int pageSize;
protected int curPage;
protected String command = "";
}
可以看到,在PageableResultSet2中,包含了一個ResultSet的實例(這個實例只是實現了ResultSet接口,事實上它是由各個數據庫廠商分別實現的),并且把所有由ResultSet繼承來的方法都直接轉發給該實例來處理。
PageableResultSet2中繼承自ResultSet的主要方法:
//……
public boolean next() throws SQLException {
return rs.next();
}
//……
public String getString(String columnName) throws SQLException {
try {
return rs.getString(columnName);
}
catch (SQLException e) {//這里是為了增加一些出錯信息的內容便于調試
throw new SQLException (e.toString()+" columnName="
+columnName+" SQL="+this.getCommand());
}
}
//……
只有在Pageable接口中新增的方法才需要自己的寫方法處理。
/**方法注釋可參考Pageable.java
*/
public int getCurPage() {
return curPage;
}
public int getPageCount() {
if(rowsCount==0) return 0;
if(pageSize==0) return 1;
//calculate PageCount
double tmpD=(double)rowsCount/pageSize;
int tmpI=(int)tmpD;
if(tmpD>tmpI) tmpI++;
return tmpI;
}
public int getPageRowsCount() {
if(pageSize==0) return rowsCount;
if(getRowsCount()==0) return 0;
if(curPage!=getPageCount()) return pageSize;
return rowsCount-(getPageCount()-1)*pageSize;
}
public int getPageSize() {
return pageSize;
}
public int getRowsCount() {
return rowsCount;
}
public void gotoPage(int page) {
if (rs == null)
return;
if (page < 1)
page = 1;
if (page > getPageCount())
page = getPageCount();
int row = (page - 1) * pageSize + 1;
try {
rs.absolute(row);
curPage = page;
}
catch (java.sql.SQLException e) {
}
}
public void pageFirst() throws java.sql.SQLException {
int row=(curPage-1)*pageSize+1;
rs.absolute(row);
}
public void pageLast() throws java.sql.SQLException {
int row=(curPage-1)*pageSize+getPageRowsCount();
rs.absolute(row);
}
public void setPageSize(int pageSize) {
if(pageSize>=0){
this.pageSize=pageSize;
curPage=1;
}
}
PageableResultSet2的構造方法:
public PageableResultSet2(java.sql.ResultSet rs) throws java.sql.SQLException {
if(rs==null) throw new SQLException("given ResultSet is NULL","user");

rs.last();
rowsCount=rs.getRow();
rs.beforeFirst();

this.rs=rs;
}
這里只是簡單的取得一個總記錄數,并將記錄游標移回初始位置(before first),同時將參數中的ResultSet賦給成員變量。


Pageable的使用方法
因為Pageable接口繼承自ResultSet,所以在使用方法上與ResultSet一致,尤其是在不需要分頁功能的時候,可以直接當成ResultSet使用。而在需要分頁時,只需要簡單的setPageSize, gotoPage,即可。
PreparedStatement pstmt=null;
Pageable rs=null;
……//構造SQL,并準備一個pstmt.
rs=new PageableResultSet2(pstmt.executeQuery());//構造一個Pageable
rs.setPageSize(20);//每頁20個記錄
rs.gotoPage(2);//跳轉到第2頁
for(int i=0; i<rs.getPageRowsCount(); i++){//循環處理
int id=rs.getInt(“ID”);
……//繼續處理
}


總結
一個好的基礎類應該是便于使用,并且具備足夠的可移植性,同時要保證其功能的完善。在上面的實現中,我們從java.sql.ResultSet接口繼承出Pageable,并實現了它。這就保證了在使用中與JDBC原有操作的一致性,同時對原有功能沒有縮減。
同時它也是易于使用的,因為封裝了一切必要的操作,所以在你的代碼中唯一顯得"難看"和"不舒服"的地方就是需要自己去構造一個PageableResultSet2。不過只要你愿意,這也是可以解決的。
當然它也有具有充分的可移植性,當你將數據庫由Oracle變為Mysql或者SQLServer的時候,你仍然可以使用這些分頁的代碼。它在使用中(或 者說在移植的過程中)唯一的限制就是你必須要使用一個支持JDBC2的驅動(現在明白為什么我把類命名為PageableResultSet2了 吧。:P),不過,好在JDBC2已經成為標準了,絕大多數的數據庫(如Oracle, Mysql, SQLServer)都有自己的或者第三方提供的JDBC2的驅動。
OK,這個分頁的實現是否對你的編程有幫助呢?仔細看看,其實真正自己寫的代碼并不多的,大部分都只是簡單的轉發操作。一個合適的模式應用可以幫你很大忙。

JSP分頁代碼


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99999久爱视频在线观看 | 亚洲一片 | 四虎网址最新 | 国产欧美日韩综合 | 天天射日日操 | 国产亚洲精品在天天在线麻豆 | 中文字幕伊人 | 亚洲欧洲精品视频 | 久久激情视频 | 久久伊人成人 | 奇米影视第四色在线 | 97天天做天天爱夜夜爽 | 亚洲免费在线视频播放 | 玖玖国产精品视频 | 国产青草视频免费观看97 | 日本叼嘿| 中文字幕视频在线播放 | 波多野结衣乳巨码无在线观看 | 加勒比一本大道在线 | 亚洲欧美日韩国产 | 免费a级在线观看完整片 | 欧美激情毛片 | 99久热成人精品视频 | 一级毛片视频在线观看 | 久青草国产手机视频免费观看 | 欧美成人四级剧情在线播放 | 国产91精品一区二区视色 | 狠色狠狠色狠狠狠色综合久久 | 国产香蕉国产精品偷在线观看 | 四虎国产精品永久在线网址 | 亚洲一级毛片欧美一级说乱 | 久久机热一这里只精品 | 久久精品亚洲日本波多野结衣 | 成年女人毛片免费观看中文w | 另类 欧美 视频二区 | 久久精品成人免费网站 | 久久精品免费看 | 久久久免费观成人影院 | 综合久久久久6亚洲综合 | 在线色片| 狠狠色狠狠色综合系列 |